STL vector通常是如何实现的?它具有char[]的原始存储,偶尔会按一定因素调整大小,然后在push_back元素时调用放置new(我应该指出的是非常有趣的语法形式-语言学家应该研究这样的动词形式,即pushed_back :))。然后有对齐要求。因此,一个自然的问题就出现了:如何在char[]上调用放置new并确保满足对齐要求?所以我搜索了2003年的C++标准中单词“alignment”,找到了以下内容:
段落3.9条款5
对象类型具有对齐要求(3.9.1、3.9.2)。完整对象类型的对齐方式是一个表示字节数的实现定义整数值;对象分配在满足其对象类型的对齐要求的地址上。
段落5.3.4条款10:
新表达式将请求的空间量作为std::size_t类型的第一个参数传递给分配函数。该参数不得小于正在创建的对象的大小;仅当对象是数组时,它可能大于正在创建的对象的大小。对于char和unsigned char数组,新表达式的结果与分配函数返回的地址之间的差异应该是任何大小不大于正在创建的数组的任何对象类型最严格对齐要求(3.9)的整数倍。[注意:因为假定分配函数返回适当对齐于任何类型的对象的存储指针,所以数组分配开销的这个限制允许将字符数组分配到稍后将放置其他类型对象的地方。]
这两个给出了我上述问题的完全令人满意的答案,但是...
声明1:
X类型对象的对齐要求,其中sizeof(X) == n,至少是X地址可被n整除或类似的东西(将所有架构相关的东西放入“或类似的东西”中)。
问题1:请确认、完善或否认上述声明1。
声明2:如果声明1正确,则从标准中的第二个引用可以得出结论:5000000个字符的数组在可被5000000整除的地址处分配,这对我只需要char数组本身而不是作为可能放置其他对象的原始存储来说是完全不必要的。
问题2:那么,成功分配1000个字符的机会是否真的比500个shorts(如果short是2字节)低?这在实践中是一个问题吗?
段落3.9条款5
对象类型具有对齐要求(3.9.1、3.9.2)。完整对象类型的对齐方式是一个表示字节数的实现定义整数值;对象分配在满足其对象类型的对齐要求的地址上。
段落5.3.4条款10:
新表达式将请求的空间量作为std::size_t类型的第一个参数传递给分配函数。该参数不得小于正在创建的对象的大小;仅当对象是数组时,它可能大于正在创建的对象的大小。对于char和unsigned char数组,新表达式的结果与分配函数返回的地址之间的差异应该是任何大小不大于正在创建的数组的任何对象类型最严格对齐要求(3.9)的整数倍。[注意:因为假定分配函数返回适当对齐于任何类型的对象的存储指针,所以数组分配开销的这个限制允许将字符数组分配到稍后将放置其他类型对象的地方。]
这两个给出了我上述问题的完全令人满意的答案,但是...
声明1:
X类型对象的对齐要求,其中sizeof(X) == n,至少是X地址可被n整除或类似的东西(将所有架构相关的东西放入“或类似的东西”中)。
问题1:请确认、完善或否认上述声明1。
声明2:如果声明1正确,则从标准中的第二个引用可以得出结论:5000000个字符的数组在可被5000000整除的地址处分配,这对我只需要char数组本身而不是作为可能放置其他对象的原始存储来说是完全不必要的。
问题2:那么,成功分配1000个字符的机会是否真的比500个shorts(如果short是2字节)低?这在实践中是一个问题吗?
char
没有被定义为任何特定数量的字节。它只是 C++ 中用于寻址内存的最小单元。但是,例如,char
可以是 2 或 4 个字节。 - jalfchar
称为byte
,但没有指定每个字节的位数。我倾向于称其为 C-byte。 - Šimon Tóth