【发布时间】:2021-11-10 01:12:25
【问题描述】:
我对 _alloca 函数做了几次搜索,一般不推荐。 我将有一个动态更新的字符串数组,我必须经常对其进行迭代。 我希望在堆栈上分配每个字符串以尽可能减少未命中缓存。
使用 _alloca 我可以在堆栈上创建一个 char* 并将其放入向量中。 我的 char 将位于一个不会影响我的堆栈的向量中,并且我知道当我在堆栈上分配字符串时,这些字符串永远不会大到导致堆栈溢出。
在这种情况下使用它是不是一件坏事?
程序是否按照我的意愿执行?
#include <vector>
#include <cstring>
#ifdef __GNUC__
# define _alloca(size) __builtin_alloca (size)
#endif /* GCC. */
std::vector<const char*> vec;
void add(const char* message, int size) {
char* c = (char*) _alloca (size * sizeof(char*));
std::memcpy(c, message, sizeof(message));
vec.push_back(c);
}
int main() {
const char* c = "OK";
for (int i = 0; i < 10; ++i) {
add(c, 2);
}
}
【问题讨论】:
-
你的
add函数已经坏了,当add退出时,存储在vec中的指针将悬空 -
我愿意打赌
std::vector<std::string>对你来说会表现得很好。您是否尝试过并测量了性能以知道它不是您需要的?另外,我认为这有 UB,因为_alloc应该在add返回后释放内存。 -
它最终被破坏了因为内存是在堆栈上分配的。当函数退出时,堆栈会被“清除”。您如何确定
std::string导致缓存未命中?大多数实现都执行小字符串优化 -
当在慢与正确、快与坏之间做出选择时,请选择慢与正确。
-
你不能在没有额外分配的情况下复制它,因为
std::vector拥有的内存位于“其他地方”。您可以做的最接近的事情是std::vector<std::array<char, SOME_MAX_SIZE>>并在那里手动创建以 null 结尾的字节字符串,但这有其自身的缺点(例如:确定SOME_MAX_SIZE应该是什么)
标签: c++ string memory memory-management