加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 把它放在堆栈上还是放在堆上?

发布时间:2020-12-16 09:36:03 所属栏目:百科 来源:网络整理
导读:碰巧该函数使用本地缓冲区来准备一些有限大小的数据块并将其传递给另一个函数,如下所示: void foo(){ char buffer[MAX_SIZE]; size_t size = write_fancy_things(buffer); bar(buffer,size);} 但是,根据MAX_SIZE的值,您可能会担心吃太多堆栈并使用类似于以
碰巧该函数使用本地缓冲区来准备一些有限大小的数据块并将其传递给另一个函数,如下所示:

void foo()
{
  char buffer[MAX_SIZE];
  size_t size = write_fancy_things(buffer);
  bar(buffer,size);
}

但是,根据MAX_SIZE的值,您可能会担心吃太多堆栈并使用类似于以下示例的代码替换代码(但希望更关心内存管理):

void foo()
{
  static char *buffer = new char[MAX_SIZE]; 
  size_t size = write_fancy_things(buffer);
  bar(buffer,size);
}

一般情况下,这两个函数的行为应该相同.但是,在第一个示例中,如果MAX_SIZE太大,我们更有可能达到堆栈限制.如果你知道函数的使用位置,那么使用大值可能没问题,但有时你不是.

在第二个例子中,我们正在处理额外的间接,缓冲区更容易出现CPU缓存未命中,这可能是foo位于低延迟关键路径上的情况,并且我们预计在大多数情况下准备缓冲区的成本非常低案例.

你认为什么尺寸太大而无法叠加?在堆栈上放置大块数据也有任何损失,但只使用它的一小部分?

编辑:write_fancy _things只是说*我正在向缓冲区写入一些数据的同义词,介于1和MAX_SIZE字节之间*.您可以将第二个foo示例视为类方法,将静态指针视为在构造函数中分配的类成员.我可能只是过度简化了事情,但不想引入比所需更多的复杂性并专注于堆栈问题.

解决方法

这两者甚至不相同.第二个对所有调用使用相同的缓冲区,第一个使用新的缓冲区,这意味着第二个不是线程安全的.

风格很可怕.如果write_fancy_things仅使用X多个字节,并且X在编译时未知,则动态分配X字节.不要在堆栈上分配一些有希望的最大大小,也不要使用有希望的最大大小的静态缓冲区.使用正确类型的向量,将其大小调整为适当的大小,然后使用该缓冲区.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读