gpt4 book ai didi

operator new 的 C++ 对齐,有多大关系?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:41:43 27 4
gpt4 key购买 nike

根据我的理解,64 位 linux 系统上的指针大小为 8 字节,并且这些指针的对齐要求应该是 8 字节对齐。如果是这样,那么为什么 new 运算符返回 16 字节(可能是 32,但重要的是这个数字大于 8)对齐的指针?简单的调用如

struct alignas(8) SimpleChar     
{
char c;
}

SimpleChar * c = new SimpleChar;
SimpleChar * c1 = new SimpleChar;

将分配 32 个字节,因为每个指针都是 16 字节对齐的。相反,如果我使用 placement new

 SimpleChar * c = new (slab) SimpleChar;
SimpleChar * c1 = new (slab + 8) SimpleChar;

这将导致两种指针类型使用 16 个字节。我的问题如下 -

  1. operator new 返回指针的 16 字节对齐真的有必要吗?
  2. 使用 placement new 并将每个结构和指针对齐 8 个字节是否有任何副作用? (我能想到的一个副作用是这种方法可能会使用更多内存,因为结构可能只需要 4 字节对齐)
  3. 我知道我们可以定义比 8 对齐更高的结构,但是如果我我没有在任何地方明确地这样做那么可以安全地假设我使用的任何结构或指针在 64 位 Linux 系统上最大对齐为 8 字节

干杯,RG

编辑:我没有直接使用 char,而是指定了一个结构来控制对齐。

最佳答案

在获得完美的打包(分配时没有浪费空间)、易于重用 block (减少由于空洞造成的浪费)、速度和代码简单性之间存在矛盾。

仅分配大小为 16 字节整数倍的 16 字节对齐 block 可能会浪费一点内存,但会大大简化事情。

关于operator new 的 C++ 对齐,有多大关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48656489/

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