在 C++ 中,在对象内分配多个数据时,堆栈分配是不是更有效? A_Heap 类在下面的程序中效率会降低吗? [复制]

Posted

技术标签:

【中文标题】在 C++ 中,在对象内分配多个数据时,堆栈分配是不是更有效? A_Heap 类在下面的程序中效率会降低吗? [复制]【英文标题】:in C++, is stack allocation is more efficient when allocating multiple data inside a object? class A_Heap will be less efficient in below program? [duplicate]在 C++ 中,在对象内分配多个数据时,堆栈分配是否更有效? A_Heap 类在下面的程序中效率会降低吗? [复制] 【发布时间】:2020-08-27 01:54:23 【问题描述】:

/* 我有两节课。一种是在堆栈上为其成员分配内存,而另一种是在堆上分配内存。见下面的代码 sn-p.*/

class A_Heap 

public:
    A_Heap()

    
        ptr = new char[256];
        int_ptr = new int[1024];
    

private:

    char * ptr;
    int * int_ptr;
    int abc;
    char ch;

;

class A_Stack 

public:
    A_Stack()
    
    

private:

    char ptr[256];
    int int_ptr[1024];
    int abc;
    char ch;
;

/*class A_Heap 会降低效率,因为在堆上分配内存会导致从用户模式到内核模式的两次上下文切换? */

【问题讨论】:

高效在什么意义上?时间?记忆?堆栈空间是有限的,所以分配空间并不总是一种选择。 你正在进入微优化,这几乎不值得花时间去打扰它们(除非你真的测量这是你的前两个瓶颈程序)。如果您在编译时知道大小,请考虑使用std::array,如果不知道则使用std::vector。对于字符串,请始终使用std::string(或者可能是std::string_view)。 如有疑问,请使用自动存储,即堆栈。首选 std::vectorstd::array 而不是原始数组。最后,与原始指针相比,更喜欢智能指针。您的时间可能会更好地投入到微优化以外的领域。 高效的时间。 堆栈分配基本上只涉及堆栈相关寄存器的更新。堆分配要复杂得多,可能会慢很多倍,例如142 times in this demo。 【参考方案1】:

在 C++ 中,堆栈分配是否更高效...?

是的,就时间而言。

出于明显的原因,就堆栈使用而言,通常不会。

...在一个对象内分配多个数据时?

还是可以的。

请注意,从绝对值来看,分配成本可能非常小。因此,这种效率差异是否显着,可能取决于您执行了多少次分配。

请注意,A_Stack 是一个非常大的对象。它们中只有极少数适合典型大小的堆栈,并且该空间与所有其他自动变量共享。如果不小心处理,在堆栈上创建此类对象可能会导致堆栈溢出。

您可以做的是动态分配一个A_Stack 对象。这样可以最大限度地减少动态分配的数量,同时仍然不会占用所有堆栈空间。

【讨论】:

我同意动态分配 A_Stack。它为您提供两全其美的体验。 很抱歉没有正确表达我的观点。对于分配,我将只使用堆,这意味着我将调用 new A_Stack 或 new A_Heap。我的问题是哪个版本的 A 会更有效? A_Stack 分配同一个块中的所有数据,还是 A_Heap 再调用两次 new?

以上是关于在 C++ 中,在对象内分配多个数据时,堆栈分配是不是更有效? A_Heap 类在下面的程序中效率会降低吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C++ 堆栈分配对象,显式析构函数调用

C++ 堆栈分配的对象赋值和析构函数调用

对象向量是不是在 C++ 中的堆或堆栈上分配?

C++:编译器如何知道为每个堆栈帧分配多少内存?

C++ STL 内存管理:堆栈还是堆?

当返回可能在 C++ 中的堆栈上分配的成员时,最好的指针/引用类型是啥?