typedef struct{
char t1;
long long t2;
char t3;
}struct_size_test;
printf("sizeof(long long)==[%ld]\n", sizeof(long long));
printf("sizeof(char)==[%ld]\n", sizeof(char));
printf("sizeof(struct_size_test)==[%ld]\n", sizeof(struct_size_test));
iOS 和 OS X gcc 中 struct_size_test 的结果是不同的。
iOS 中的结果是
sizeof(long long)==[8]
sizeof(char)==[1]
sizeof(struct_size_test)==[24]
但是 OS X gcc 中的结果是
sizeof(long long)==[8]
sizeof(char)==[1]
sizeof(struct_size_test)==[16]
我用谷歌搜索了这个并找到了一些建议,将“-malign-double”添加为 gcc 编译标志。 但它表明
clang: error: unknown argument: '-malign-double' [-Wunused-command-line-argument-hard-error-in-future]
clang: note: this will be a hard error (cannot be downgraded to a warning) in the future
知道如何同步 iOS 和 OS X 的结构填充吗? 非常感谢!
您可以使用预处理器指令来指定结构的字节对齐方式,这样编译器就不会进行填充:
#pragma pack(1)
typedef struct{
char t1;
long long t2;
char t3;
}struct_size_test;
#pragma options align=reset
如果结构体定义在无法更改的头文件中,请说 test.h:
//test.h
typedef struct{
char t1;
long long t2;
char t3;
}struct_size_test;
当你包含 test.h 时,你可以这样做:
#pragma pack(1)
#include test.h
#pragma options align=reset
我在自己的代码中使用了这个方法。
请记住,上述解决方案实际上不是编译器标志,而是预处理器指令,其效果与您所要求的效果相同。希望这有帮助。
我认为答案应该是你肯定不想这样做。
您可以尝试 nneonneo 的解决方案或将
__attribute__((packed))
添加到您的结构中,以使结构在 OS X 和 iOS 上具有相同的大小,但请记住,这是编译器特定的功能,并且会使您的代码不易移植
此外,如果您确实更改了填充,由于未满足对齐要求,您的程序可能会在任一架构(尤其是 iOS/ARM)上崩溃或运行效率降低。一些 ARM 架构(不确定 iDevices)不允许未对齐的读/写,如果运行速度不慢,就会彻底崩溃(因为需要两次内存读取而不是一次)。
解决方法可能是使用最高通用对齐方式(似乎是 8),这只会占用更多空间。但这仍然是老套且不可移植。
你为什么要尝试这样做?
编辑:nneonneo 的答案可能应该是这样的:
typedef struct{
char t1 __attribute__ ((aligned (8)));
long long t2 __attribute__ ((aligned (8)));
char t3 __attribute__ ((aligned (8)));
} struct_size_test;
您可以尝试添加显式类型属性来控制结构对齐:
typedef struct{
char t1;
long long t2;
char t3;
} struct_size_test __attribute__ ((aligned (8))); // aligned(8) = 8-byte alignment