Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何避免结构填充?_C_Memory Management_Structure_Padding - Fatal编程技术网

C 如何避免结构填充?

C 如何避免结构填充?,c,memory-management,structure,padding,C,Memory Management,Structure,Padding,我很想知道#pragma如何帮助避免结构填充(请给我一个程序来理解它) 默认情况下,编译器将以对齐的方式分配内存。因此,通过避免结构填充,程序员将得到什么好处? 什么时候有必要避免结构填充?1.在资源关键型嵌入式系统中,通常避免结构填充。在这种情况下,通过以代码内存为代价打包结构成员来节省RAM(需要更多指令来访问打包的结构成员) 在某些情况下,字节数组映射到结构成员以便于访问 1.在资源关键型嵌入式系统中,通常避免结构填充。在这种情况下,通过以代码内存为代价打包结构成员来节省RAM(需要更多指

我很想知道
#pragma
如何帮助避免结构填充(请给我一个程序来理解它)

默认情况下,编译器将以对齐的方式分配内存。因此,通过避免结构填充,程序员将得到什么好处?
什么时候有必要避免结构填充?

1.在资源关键型嵌入式系统中,通常避免结构填充。在这种情况下,通过以代码内存为代价打包结构成员来节省RAM(需要更多指令来访问打包的结构成员)

  • 在某些情况下,字节数组映射到结构成员以便于访问

  • 1.在资源关键型嵌入式系统中,通常避免结构填充。在这种情况下,通过以代码内存为代价打包结构成员来节省RAM(需要更多指令来访问打包的结构成员)

  • 在某些情况下,字节数组映射到结构成员以便于访问

  • 这些技术依赖于编译器

    除了潜在地减少程序消耗的内存量之外,好处通常不多。只有在资源(如内存)很少的机器上,这种优势才有价值,这意味着现代硬件很少需要这种优势

    实际上,成本是性能降低或硬件异常。填充的常见目的是通过以适合主机系统的方式对齐结构成员来提高性能和避免硬件异常。不允许填充基本上关闭了填充的所有好处


    节省几个字节,甚至几千字节,在性能或更多错误情况方面,很少值得这样做。如果您正在进行某些类型的开发(例如,在资源有限的嵌入式系统上),这可能是值得的,但即使这样,也不总是值得的。

    这些技术取决于编译器

    除了潜在地减少程序消耗的内存量之外,好处通常不多。只有在资源(如内存)很少的机器上,这种优势才有价值,这意味着现代硬件很少需要这种优势

    实际上,成本是性能降低或硬件异常。填充的常见目的是通过以适合主机系统的方式对齐结构成员来提高性能和避免硬件异常。不允许填充基本上关闭了填充的所有好处


    节省几个字节,甚至几千字节,在性能或更多错误情况方面,很少值得这样做。如果您正在进行某些类型的开发(例如,在资源有限的嵌入式系统上),这可能是值得的,但即使这样也不总是值得的。

    使用预处理器指令#pragma 1可以避免结构填充
    编译器将以一的倍数计算内存

    使用预处理器指令#pragma 1可以避免结构填充
    编译器将以1的倍数计算内存

    这不是C标准的一部分,但编译器有办法将其作为扩展处理。然而,不同的编译器执行不同的操作,如果您需要帮助,您必须告诉我们您使用的编译器。你可能还想告诉我们你为什么想要它。建议:你不想要它,你不需要它。除非绝对必要,否则请避免使用它。请看,我正在使用gcc编译器。
    #pragma pack(1)
    禁用字节填充,并
    #pragma pack()
    重新启用它。它不是C标准的一部分,但编译器有办法将其作为扩展处理。然而,不同的编译器执行不同的操作,如果您需要帮助,您必须告诉我们您使用的编译器。你可能还想告诉我们你为什么想要它。建议:你不想要它,你不需要它。除非绝对必要,否则请避免使用它。请看,我正在使用gcc编译器。
    #pragma pack(1)
    禁用字节填充,并
    #pragma pack()
    重新启用它。在嵌入式系统中,结构打包的好处不仅仅是节省空间。例如,您可能通过通信接收到压缩字节数组,并希望对其进行解释。您可以将其转换为结构并使用字段,而不是逐字节复制和转换。当然,您必须确保Endianness和MSB与消息相同,并且处理器允许未对齐的访问。在嵌入式系统中,结构打包的好处不仅仅是节省空间。例如,您可能通过通信接收到压缩字节数组,并希望对其进行解释。您可以将其转换为结构并使用字段,而不是逐字节复制和转换。当然,您必须确保Endianness和MSB与消息相同,并且处理器允许未对齐的访问。