C++ 在对齐方面::operator new(size_t n)和new char[n]之间有什么区别?

C++ 在对齐方面::operator new(size_t n)和new char[n]之间有什么区别?,c++,C++,关于对齐,我不理解显式调用t*t=(t*):operator new(sizeof(t))和t*t=(t*)new char[sizeof(t)]之间的区别,其中t是一个类似C的结构 在“C++解决方案与C++编程语言,第三版”(参见练习12.9)中,作者说:“注意,不应该使用表达式新的字符[n]。分配原始内存,因为内存可能不能满足T的对齐要求,而全局运算符新的显式调用保证产生足够C++对象的存储。我在互联网上读到的一篇文章中也提到了这一点:(见“删除vs.删除[]和免费”一段) 另一方面,在我

关于对齐,我不理解显式调用
t*t=(t*):operator new(sizeof(t))
t*t=(t*)new char[sizeof(t)]
之间的区别,其中
t
是一个类似C的结构

在“C++解决方案与C++编程语言,第三版”(参见练习12.9)中,作者说:“注意,不应该使用表达式新的字符[n]。分配原始内存,因为内存可能不能满足T的对齐要求,而全局运算符新的显式调用保证产生足够C++对象的存储。我在互联网上读到的一篇文章中也提到了这一点:(见“删除vs.删除[]和免费”一段)

另一方面,在我之前的帖子中,一个家伙引用了这个标准,加上引用末尾的一个注释,与上面的人相矛盾:

“新表达式将请求的空间量作为std::size\t类型的第一个参数传递给分配函数。该参数不得小于所创建对象的大小;仅当对象是数组时,它可能大于正在创建的对象的大小。对于char和unsigned char数组,新表达式的结果与分配函数返回的地址之间的差值应为任何对象类型(其大小不大于所创建数组的大小)的最严格基本对齐要求(3.11)的整数倍。[注意:由于分配函数被假定为返回指向存储器的指针,该存储器对任何类型的具有基本对齐方式的对象都进行了适当对齐,因此对数组分配开销的这种约束允许使用分配字符数组的通用习惯用法,其他类型的对象稍后将被放入其中。-结束注意]”


我很困惑。你能告诉我根据标准谁就在这里吗?以防万一,为什么
:operator new()
不同于
new char[]

没错,
new char[n]
代表
operator new[](size\u t)
,请参见5.3.4“new”§8:

新表达式通过调用分配函数[…]获得对象的存储 如果分配的类型是数组类型,则分配函数的名称为
operator new[]

因此,前者绝对不可能产生比后者“更少对齐”的内存


遗憾的是,当涉及到技术细节时,大多数C++书籍只是简单的吸吮。

< P> C++ 98节3.7.3.1/2,关于分配函数:

返回的指针应适当对齐,以便将其转换为 任何完整的对象类型,然后用于访问分配的存储中的对象或阵列

连同您在§5.3.4/10中对新表达式的引用,“新表达式传递金额…”,这意味着
new char[n]
不能提供更弱的对齐保证,不能减少对齐


干杯,

标准的不同版本之间存在混淆。较旧的标准没有对新字符作出保证,而较新的标准有保证

请注意,在这两种情况下,
new char[n]
可能不会返回它从底层
运算符new(size\t)
返回的相同指针,这是因为在分配数组时,运行时可能会使用分配块开头的空间(即
运算符new(size\t)之间的空间)
返回的内容和新字符[n]返回的内容)要存储数组的大小,并且该大小可能不需要最坏情况下的完整对齐填充。不需要实现来执行此操作,可能需要注意的是,由于
char
没有析构函数,因此它不需要记录数组的大小,就可以知道在
delete[]时要进行多少析构函数调用调用了
。但是实现可以自由地统一处理所有数组