使用__attribute __(__ packed__)的填充结构,真的值得吗?

ant*_*009 6 c gcc struct

gcc (GCC) 4.7.0
c89
x86_64
Run Code Online (Sandbox Code Playgroud)

你好,

我想知道使用__attribute__ ((__packed__))on结构是否值得.在我看来,它的结构尺寸会更小.通过我在下面进行的测试.因此使用它将是一个优势.

一个不使用它的情况,因为它不能在其他编译器中移植.所以对于visual studio C++来说,这是行不通的.还有其他编译器.

编译器不优化代码吗?那么真的让编译器决定做什么对性能更好?

使用aligned属性会有什么不同吗?__attribute__((packed, aligned(4)))当我添加它返回12的大小.

非常感谢任何建议,

#include <stdio.h>

struct padded {
    int age;      /* 4                    */
    char initial; /* 1 + 3 padded bytes   */
    int weight;   /* 4     --> total = 12 */ 
};

struct __attribute__ ((__packed__)) unpadded {
    int age;      /* 4                  */
    char initial; /* 1                  */
    int weight;   /* 4    --> total = 9 */
};

int main(int argc, char **argv)
{
    struct padded padded_test;
    struct unpadded unpadded_test;

    printf("Padded   [ %ld ]\n", sizeof(struct padded));
    printf("Unpadded [ %ld ]\n", sizeof(struct unpadded));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

eca*_*mur 13

在某些体系结构(例如ia64,sparc64)上,未对齐的内存访问可能会非常慢. __attribute__((__packed__))主要用于通过网络发送数据并希望确定布局的地方; 不值得尝试用它来节省内存空间.

如果您正在考虑使用__attribute__((__packed__))电线传输,请再想一想; 它不处理字节序,它是非标准的.自己编写编组代码更安全,使用库(例如协议缓冲区)更聪明.

  • 您可以*使用`__packed__`来传输已经定义的格式(例如公共协议),通过`htonl`来处理字节序.但即便如此,它也几乎不值得,当你编写一个你认为符合规范的结构时,你也可以明确地编写字段的大小和偏移量. (3认同)