gpt4 book ai didi

c++ - 为结构成员分配的内存是连续的吗?如果结构成员是数组怎么办?

转载 作者:IT老高 更新时间:2023-10-28 12:33:08 25 4
gpt4 key购买 nike

在 C/C++ 中,假设我定义了一个名为 test 的简单结构,如下所示。

struct test
{
double height;
int age;
char gender;
}

对于这个结构的特定实例,说 test AA.height, A.age, A.gender 连续的在内存中?

更一般地说,数组结构和结构数组在内存中的布局是什么样的?一张照片真的很有帮助。

最佳答案

它们在内存中不一定是连续的。这是由于 struct padding .

但是,在您的特定情况下,它很可能是连续的。但是如果你把顺序改成这样:

struct test
{
char gender;
int age;
double height;
}

那么他们很可能不会。但是,在您的特定情况下,您仍然可能会在 gender 之后获得填充,以将结构重新对齐为 8 个字节。


SoA(Struct of Arrays)和AoS(Array of Structs)的区别如下:

SoA:

-----------------------------------------------------------------------------------
| double | double | double | *pad* | int | int | int | *pad* | char | char | char |
-----------------------------------------------------------------------------------

AoS:

-----------------------------------------------------------------------------------
| double | int | char | *pad* | double | int | char | *pad* | double | int | char |
-----------------------------------------------------------------------------------

请注意,每个结构中的 AoS 填充。而 SoA 在阵列之间填充。

这些有以下权衡:

  1. AoS 往往对程序员来说更具可读性,因为每个“对象”都保存在一起。
  2. 如果结构的所有成员一起访问,
  3. AoS 可能具有更好的缓存局部性。
  4. SoA 可能会更有效,因为将相同的数据类型组合在一起有时会暴露矢量化。
  5. 在许多情况下,SoA 使用较少的内存,因为填充仅在数组之间而不是在每个结构之间。

关于c++ - 为结构成员分配的内存是连续的吗?如果结构成员是数组怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8377667/

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