gpt4 book ai didi

c++ - C(++) 结构力额外填充

转载 作者:可可西里 更新时间:2023-11-01 16:29:21 31 4
gpt4 key购买 nike

我见过无数问题,形式为“我不喜欢填充,我该如何关闭它”,但还没有找到任何关于强制编译器提供额外填充的信息。

我手头的具体情况是这样的

struct particle{
vect2 s;
vect2 v;
int rX;
int rY;
double mass;
int boxNum;
};

其中 vect2 是一个简单的 struct {double x;双 y;} vect2.为了使用 SSE2,我需要能够加载一对 double ,对齐到 16 字节边界。这曾经有效,直到我添加了额外的 int,将我的结构大小从 48 字节推到 56 字节。结果是段错误。

是否有某种我可以使用的编译器指令说“填充此结构使其成为 16 字节长的倍数”,或“此结构具有 16 字节的对齐方式”?我知道我可以手动完成(例如添加一个额外的 char[12]),但我真的宁愿只告诉编译器(GCC,最好是 ICC 兼容),如果我更改 future 的结构。

最佳答案

您可以嵌套两个结构以自动填充它,而无需自己跟踪大小。

struct particle
{
// ...
};

{
particle p;
char padding[16-(sizeof(particle)%16)];
};

不幸的是,如果结构已经是 16 的倍数,这个版本会增加 16 个字节。这是不可避免的,因为标准不允许零长度的数组。

一些编译器确实允许零长度数组作为扩展,在这种情况下你可以这样做:

struct particle_wrapper
{
particle p;
char padding[sizeof(particle)%16 ? 16-(sizeof(particle)%16) : 0];
};

如果结构已经是 16 的倍数,则此版本不会添加任何字节的填充。

关于c++ - C(++) 结构力额外填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11160551/

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