gpt4 book ai didi

c++ - 结构的大小和对齐方式

转载 作者:行者123 更新时间:2023-11-30 04:46:29 25 4
gpt4 key购买 nike

根据这个post ,struct 的对齐是特定于实现的,这意味着不同的编译器将以不同的方式对齐 struct 中的成员,从而在不同的编译器中给出相同结构的不同大小。

但是,在这个video , 发言人说以下结构在编译器中的大小必须为 16 和 12:

#include <iostream>

struct C {
uint64_t x;
uint32_t y;
};

struct D {
uint32_t x;
uint32_t y;
uint32_t z;
};

int main() {
std::cout << sizeof(C) << std::endl;
std::cout << sizeof(D) << std::endl;
}

他们确实是 16 岁和 12 岁。

为什么他们必须是 16 岁和 12 岁?不是 16 还是 16?

最佳答案

And they are indeed 16 and 12.

它们的大小是这样的,给定:

  • 您使用的编译器(和选项)
  • 您的目标平台
  • 代码中缺少与对齐/打包相关的指令

对于您的视频,我想演讲者只是使用给定的平台/工具链来开发他的示例。但是总的来说,自 sizeof(T)依赖于编译器/平台,std::atomic<T>::is_lock_free()也依赖于编译器/平台。

例子

使用以下结构:

struct C {
uint64_t x;
uint32_t y;
};

不同的编译器和选项

目标平台

对齐/包装指令

为什么会有这些差异?

编译器可以在结构/类的任何字段之后自由添加未使用的位/字节。他们这样做是出于性能原因:在某些平台上,读/写多字节的速度更快 int验证某些对齐属性(通常, N 的地址 int 必须被 N 整除)。

通常,您的 C++ 编译器在您背后执行低级优化很方便。有时您希望对此功能进行更多控制(原因不详尽):

  • 当您序列化将由不同程序读取的数据时(保存到文件,发送到网络)。
  • 当内存使用比执行速度更重要时。
  • 在多核和多线程程序中,控制多少struct有一个 CPU cache line可以限制cache invalidations内核之间,从而提高执行速度。

这就是编译器通常提供实用程序来控制它的原因。

长话短说

sizeof(T)对于给定的 T,“不必”是任何东西.它依赖于编译器/平台,您通常可以使用特定的编译器指令覆盖它。

关于c++ - 结构的大小和对齐方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56712454/

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