关于比对,我不明白T* t = (T*) ::operator new(sizeof(T))
和T* t = (T*)new char[sizeof(T)]
的显式调用之间的差异,其中T
是一个类C结构。:: operator new(size_t n)和new char [n]在对齐方面有什么区别?
在这本书中的“C++解决方案伴侣对C++编程语言,第三版”(见练习12.9),作者说:“需要注意的是一个不应使用表达新的char [N]分配原始内存,因为该内存可能不满足T的对齐要求,而全局运算符new的显式调用将保证产生足够与任何C++对象对齐的存储。“”。这也是我在互联网上阅读的文章中提到的:http://www.scs.stanford.edu/~dm/home/papers/c++-new.html(请参阅“删除与删除[]和免费”段落)。
在另一方面,在我以前的帖子Data alignment in C++, standard and portability一个家伙引用的标准,再加上这违背上面的人报价的最后一个音符:
“一种新的表达传递的空间量请求分配函数作为std :: size_t类型的第一个参数,该参数不得小于正在创建的对象的大小;它可能大于只有当对象是数组时才创建的对象的大小。对于char和unsigned char数组,new-expression的结果与分配函数返回的地址之间的差异应是任何大小为no的对象类型的最严格基本对齐要求(3.11)的整数倍大于正在创建的数组的大小。 [注意:因为分配函数被假定为返回指向存储器的指针,这些指针对于具有基本对齐的任何类型的对象都适当地对齐,所以这种对数组分配开销的约束允许分配其他类型的对象稍后将放置到其中的字符数组的通用惯用法。 - 注完]“
我很困惑,你能告诉我,谁是这里根据标准,并在情况下,为什么是new char[]
's/new char(n)/ new char [n] /' – fredoverflow
谢谢!现在修好了! –