gpt4 book ai didi

c - 为什么 sizeof 在 32 位进程的 linux 和 VS 上不同?即使是 "#pragma pack"和 "-fpack-struct"

转载 作者:太空宇宙 更新时间:2023-11-04 01:45:32 24 4
gpt4 key购买 nike

#include "stdio.h"

#pragma pack(8)
struct testSize {
int a; //size 4, alignment 8
double b;//size 8, alignment 8
};
#pragma pack()

int main(int argc, char** argv)
{
printf("sizeof testSize %d \n", sizeof(struct testSize));
printf("sizeof int %d , sizeof double %d\n", sizeof(int), sizeof(double));

return 0;
}

一个结构体的默认最大对齐是8,我们也可以通过#pragma pack(8)-fpack-struct=8来设置。但是在用 gcc 编译的 32 位进程上,它不起作用。

在 Linux (32) 上:

$ gcc -m32 -fpack-struct=8 -o TestSize TestSize.c
$ ./TestSize
sizeof testSize 12
sizeof int 4 , sizeof double 8

在 VS (x86) 上:

sizeof testSize 16
sizeof int 4 , sizeof double 8

在 Linux 上,对齐似乎是 4,而不是 8。From the doc ,它是“为了与 Microsoft Windows 编译器兼容”。

最佳答案

您链接的 GCC 页面说 pragma“改变了最大对齐方式”。很可能是您指定的 8 字节被忽略,取而代之的是编译目标上的 较小的默认值 4。

(打包编译指示通常在需要“打包”时使用,例如单字节对齐,用于将通过线路传输或以与程序无关的方式持久保存到磁盘的结构。它们是通常不用于强制执行任意对齐。)

关于c - 为什么 sizeof 在 32 位进程的 linux 和 VS 上不同?即使是 "#pragma pack"和 "-fpack-struct",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54472112/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com