gpt4 book ai didi

c - 我应该避免在堆栈上放置大对象吗?

转载 作者:行者123 更新时间:2023-12-01 11:54:14 25 4
gpt4 key购买 nike

在非递归函数中,通常可以将大数据类型放在堆栈上吗?

一个方便的地方是在需要清理的 C 函数中。

例如 我有一个 C 函数,允许我像这样读/写任意数据包。

int do_something()
{
char buf[9000];
struct ot_packet_t p;

pkt_init(&p);
pkt_set_type(&p, "WDAT");
pkt_write_uint32(&p, some_var);
pkt_write_data(&p, some_data, some_len);

// other stuff...
// if need to early exit... buf & p cleaned up. An RAII approach.

send_packet(buf, pkt_get_length(&p));
}

我已经用 C++ 标记了这个问题,它也适用于 C++。尽管至少在 C++ 上,我通常会使用 auto_ptr 来清理堆上分配的较大对象。在 C 中,我认为这不是很整洁,对吧?

最佳答案

在主流 PC 上的单线程应用程序中,无需太担心:这里几 KiB,那里几 Kib;最终,也许,您会在堆栈中达到一两个 MiB。堆栈会以应用程序的最低成本自动增长。

如果您处理的是多线程应用程序,情况就不同了。每个线程都有自己的堆栈,并且(据我了解)堆栈大小在线程启动时是固定的。如果你开始用大的局部变量使线程的堆栈变得困惑,你可能会耗尽所有堆栈并耗尽空间。因此,最好对较大的对象使用动态内存分配,以避免遇到此类问题。由于您也可以为单线程应用程序进行动态分配,如果程序有合理的机会演变成多线程程序,那么也许您应该从一开始就使用动态分配。请注意,动态分配比堆栈上的自动分配慢。

如果您正在处理内存有限的系统,那么您希望避免创建大对象,就这样。至少,您必须担心在任何时候存在多少,并确保尽快发布它们。

关于c - 我应该避免在堆栈上放置大对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8632728/

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