运算符的C ++对齐新,有多重要?

时间:2018-02-07 05:19:17

标签: c++ memory-alignment

根据我的理解,64位linux系统的指针大小为8字节,对齐要求应为8字节对齐。如果是这种情况那么为什么新的操作符返回16个字节(可能是32,但是这个数字是否高于8),对齐指针?简单的调用,如

struct alignas(8) SimpleChar     
{
    char c;
}

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

将分配32个字节,每个指针对齐16个字节。如果相反,我使用了新的

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

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

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

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

1 个答案:

答案 0 :(得分:0)

在获得完美包装(分配时没有浪费的空间),重新使用大块的容易程度(减少因孔造成的浪费),速度和代码简单性之间存在紧张关系。

仅分配16字节对齐的块是16字节大的整数倍可能会浪费一点内存,但会大大简化。