6
gcc (GCC) 4.7.0
c89
x86_64

你好,

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

不使用它的情况,因为它不能跨其他编译器移植。因此,对于 Visual Studio C++,这是行不通的。加上其他编译器。

编译器不会优化代码吗?所以真的让编译器来决定做什么会更好地提高性能吗?

使用对齐的属性会有什么不同吗?__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;
}
4

2 回答 2

13

在某些体系结构(例如 ia64、sparc64)上,未对齐的内存访问可能非常缓慢。 __attribute__((__packed__))主要用于您通过线路发送数据并希望确定布局的情况;不值得尝试使用它来节省内存空间。

如果您正在考虑使用__attribute__((__packed__))有线传输,请再考虑一下;它不处理字节顺序,而且它是非标准的。自己编写编组代码更安全,使用库(例如协议缓冲区)更智能。

于 2012-09-06T16:31:27.693 回答
0

另一个用途__attribute__((packed))是访问内存映射控制器。正如其他人所建议的那样,除了非常具体的事情之外,它并没有真正有用。未对齐的访问是不好的,在某些架构上它会产生异常。

于 2012-09-09T13:42:18.263 回答