gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:28:23 27 4
gpt4 key购买 nike

关于对齐,我不明白显式调用 T* t = (T*)::operator new(sizeof(T))T* t = (T*)new char[sizeof(T)],其中 T 是类 C 结构。

在“C++ Solutions Companion to The C++ Programming Language, Third Edition”一书中(参见练习 12.9),作者说:“请注意,不应使用表达式 new char[n] 来分配原始内存因为该内存可能不满足 T 的对齐要求,而全局运算符 new 的显式调用保证产生对任何 C++ 对象充分对齐的存储。”。我在网上读到的一篇文章中也提到了这一点:http://www.scs.stanford.edu/~dm/home/papers/c++-new.html (参见“删除与删除 [] 和释放”段落)。

另一方面,在我之前的帖子中Data alignment in C++, standard and portability一个人引用了标准,并在引用末尾加上一条与上述人相矛盾的注释:

"new 表达式将请求的空间量作为 std::size_t 类型的第一个参数传递给分配函数。该参数应不小于正在创建的对象的大小;它可以是仅当对象是数组时才大于正在创建的对象的大小。对于 char 和 unsigned char 数组,new 表达式的结果与分配函数返回的地址之间的差值应为任何对象类型的最严格的基本对齐要求(3.11),其大小不大于正在创建的数组的大小。[注意:因为假定分配函数返回指向存储的指针,该存储对于具有基本对齐的任何类型的对象都适当对齐,这种对数组分配开销的约束允许分配字符数组的常见习惯用法,稍后将在其中放置其他类型的对象。 - 尾注]

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

最佳答案

没错,new char[n]委托(delegate)给operator new[](size_t),见5.3.4“New”§8:

A new-expression obtains storage for the object by calling an allocation function [...] If the allocated type is an array type, the allocation function's name is operator new[]

因此,前者绝对不可能以某种方式产生比后者“更少对齐”的内存。

可悲的是,当谈到技术细节时,大多数 C++ 书籍都一塌糊涂。

关于c++ -::operator new(size_t n) 和 new char[n] 在对齐方面有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7058377/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com