结构填充编译标志

问题描述 投票:0回答:3
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 的结构填充吗? 非常感谢!

ios gcc compiler-errors padding
3个回答
3
投票

您可以使用预处理器指令来指定结构的字节对齐方式,这样编译器就不会进行填充:

#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

我在自己的代码中使用了这个方法。

请记住,上述解决方案实际上不是编译器标志,而是预处理器指令,其效果与您所要求的效果相同。希望这有帮助。


1
投票

我认为答案应该是你肯定不想这样做。

您可以尝试 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;

0
投票

您可以尝试添加显式类型属性来控制结构对齐:

typedef struct{
    char        t1;
    long long   t2;
    char        t3;
} struct_size_test __attribute__ ((aligned (8))); // aligned(8) = 8-byte alignment
© www.soinside.com 2019 - 2024. All rights reserved.