C++ 传入A::operator new()的大小是否始终等于sizeof(A)? struct A final { INTA; void*运算符新(大小\u t大小) { // //这里的大小是否总是等于sizeof(A)? // 返回::运算符新(大小); } void操作符删除(void*ptr) { ::操作员删除(ptr); } }; int main() { 用于(自动i=0;i NO./P>

C++ 传入A::operator new()的大小是否始终等于sizeof(A)? struct A final { INTA; void*运算符新(大小\u t大小) { // //这里的大小是否总是等于sizeof(A)? // 返回::运算符新(大小); } void操作符删除(void*ptr) { ::操作员删除(ptr); } }; int main() { 用于(自动i=0;i NO./P>,c++,memory-management,c++11,operator-overloading,standards,C++,Memory Management,C++11,Operator Overloading,Standards,我的问题也包含在代码中 C++标准是否保证传递到A::运算符NeW()的大小总是相同的? 更新: 这里,只考虑A是最后一类。 < P> NO./P> 尝试: 现在,当您创建B时,新操作符将获得不同的大小 struct B: public A { double a; } 引用C++11标准第5.3.4节第10点: 新表达式将请求的空间量传递给 作为std::size\t类型的第一个参数的分配函数。那个 参数不得小于所创建对象的大小; 只有在以下情况下,它才可能大于正在创建的对象的大小

我的问题也包含在代码中

C++标准是否保证传递到A::运算符NeW()的大小总是相同的?

更新: 这里,只考虑A是最后一类。

< P> NO./P> 尝试:

现在,当您创建B时,新操作符将获得不同的大小

struct B: public A
{
    double a;
}

引用C++11标准第5.3.4节第10点:

新表达式将请求的空间量传递给 作为std::size\t类型的第一个参数的分配函数。那个 参数不得小于所创建对象的大小; 只有在以下情况下,它才可能大于正在创建的对象的大小 对象是一个数组


所以,是的,它保证与物体的大小相同。但是请注意,不同的编译器或不同的编译器选项可能会在编译时改变特定对象的实际大小

如果A是最后一个类呢?@xmllmx:在C++中没有这样的东西,请查看帖子。我修改了它。我将struct设为final。final在C++11中是一个合法的关键字。那么上述情况就不适用了。
struct B: public A
{
    double a;
}
int main()
{
    for (auto i = 0; i < 100; i++)
    {
        delete new A;
        delete new B;
    }
}
void* operator new(size_t size)
{
    std::cout << "S(" << size << ")\n";
    //
    // Is size always equal to sizeof(A) here?
    //
    return ::operator new(size); 
}
> ./a.out
S(4)
S(12)
S(4)
S(12)
S(4)