gcc (GCC) 4.7.0
c89
x86_64
您好,
我想知道在结构上使用__attribute__ ((__packed__))
是否值得。在我看来,它的结构尺寸会更小。通过我在下面进行的测试。因此,使用它将是一个优势。
不使用它的情况,因为它不能在其他编译器中移植。所以对于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;
}
答案 0 :(得分:13)
在某些体系结构(例如ia64,sparc64)上,未对齐的内存访问可能会非常慢。 __attribute__((__packed__))
主要用于通过网络发送数据并希望确定布局的地方;不值得尝试用它来节省内存空间。
如果 考虑使用__attribute__((__packed__))
进行有线传输,请再想一想;它不处理字节序,它是非标准的。自己编写编组代码更安全,使用库(例如协议缓冲区)更聪明。
答案 1 :(得分:0)
__attribute__((packed))
的另一个用途是访问内存映射控制器。正如其他人所建议的那样,除非是非常具体的事情,否则不是很有用未对齐访问很糟糕,在某些体系结构上它会产生异常。