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

标签 c++ c arrays struct

在 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/

相关文章:

c++ - C++生成数据的平滑度

c++ - 使用 CPLEX (c++) 重置目标函数

C++没有匹配函数调用 `LogBlock<CrazyflieROS::logMotor>`

c++ - 如何知道小部件是否只接受数字字符

c - 在 Sublime Text 3 上运行 Hello World

带自定义键的 PHP array_push

arrays - 范围小于 k 的子数组数

c - 如何在 C 语言中使用互斥锁

c - ARM 的 NEON 对于整数比 float 更快吗?

c++ - 如何将特定大小的数组作为参数传递?