【问题标题】:What's the intent behind C++ Standard requirement that new char[] yields aligned memory?C++ 标准要求 new char[] 产生对齐内存的意图是什么?
【发布时间】:2013-05-16 08:35:25
【问题描述】:

根据 C++03 标准,5.3.4/10

对于 char 和 unsigned char 数组,new-expression 的结果与分配函数返回的地址之间的差应是任何大小为的对象类型的最严格对齐要求 (3.9) 的整数倍不大于正在创建的数组的大小。

分配函数 (operator new[]()) 也需要为任何可能的类型分配对齐的内存。所以引用的部分有效地表明new char[sizeof(T)] 应该产生与T 类型正确对齐的内存。

这个要求的目的是什么?我可以只调用operator new()(或operator new[]()),它保证返回正确对齐的内存并具有正确对齐的内存。我的意思是无论如何new char[] 会调用operator new()[] 所以我可以自己调用它。

引用要求的目的是什么?为什么不直接打电话给operator new[]()

【问题讨论】:

    标签: c++ memory-management


    【解决方案1】:

    我通常只直接调用operator new,但标准的作者决定也允许使用new char[] 作为获取原始内存的一种方式。因此对齐要求。

    【讨论】:

    • C++ 的早期版本是否允许这些其他分配原始内存的方式?这可能是为了向后兼容。
    • @Barmar 据我所知,是的。至少,new char[] 与所有早期编译器(CFront、Zortech 和 g++)一起工作;有没有保证,我不知道。
    • 这就是我的意思——new char[] 一直有效,但其他分配原始内存的方式可能没有,所以这就是人们最初的做法。
    • 这个想法是让malloc变得多余,并且它还返回对齐的内存。
    • @MSalters 使malloc 变得多余的是::operator new() 函数(它与malloc 完全一样,只是它报告错误的方式除外)。
    猜你喜欢
    • 2021-04-15
    • 2018-07-29
    • 2012-10-17
    • 2018-01-09
    • 2012-05-22
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多