0

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

  1. 将分配实际内存的低级分配器类,
  2. 高级分配器类,它将请求的对象包装char[]为适当长度的数组。

我想知道我下面关于对齐的假设是否有效。


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

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


其次,18.4.1.1 ( operator new) 规定:

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

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


最后,9.2类成员)声明:

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

因此,我会假设struct类似:

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

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


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

4

1 回答 1

1

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

struct node
{
   T[n];
   node* next;
};
于 2012-08-16T21:35:48.663 回答