对象数组作为链表中的char数组 - 我对对齐的假设有效吗?

时间:2012-08-16 21:10:11

标签: c++ alignment

我正在 C ++ 98 中编写切片分配器。分配器将包含两个模板类:

  1. 分配实际内存的低级分配器类
  2. 高级分配器类,它将请求的对象包装为适当长度的char[]数组。
  3. 我想知道我在下面做出的关于对齐的假设是否有效。


    首先,我假设在一个对象数组(类型为T)中,每个对象都正确对齐。我没有在标准中看到任何具体的内容,但对我来说这似乎是一个合理的假设。

    考虑到这一点,如果我选择sizeof(T[n]),返回的大小应该包含任何必要的填充,因此适合存储数组T[n]


    其次, 18.4.1.1 operator new)声明:

      

    1 效果 分配函数(3.7.3.1)由 new-expression (5.3.4)调用来分配 size 存储字节适当地对齐以表示该大小的任何对象。

    因此,我假设::operator new(sizeof(T[n]))应该为数组T[n]创建一个适当对齐的内存块。


    最后, 9.2 类成员)声明:

      

    17指向POD结构对象的指针(适当地使用reinterpret_cast转换)指向其初始成员(或者如果该成员是位字段,则指向它所在的单位)和副指针反之亦然。 [注意:因此,在POD-struct对象中可能存在未命名的填充,但不是在其开头,以实现适当的对齐。 ]

    因此,我认为在struct之类:

    struct node
    {
        char data[sizeof(T[n])];
        node* next;
    };
    

    通过new node分配,data成员将正确对齐数组T[n]


    上述假设是正确的还是我错过了什么?我认为我必须手动实现链表,因为C ++标准不对节点成员顺序提供任何保证。

1 个答案:

答案 0 :(得分:1)

是的,您的假设是正确的。我可能错过了一些东西,但我不明白为什么你不能有这样的东西:

struct node
{
   T[n];
   node* next;
};