C++ 线程本地变量和堆栈分配变量之间的性能
我只是想知道,因为objtost在语法上必须更易于使用,而且从我的基础研究来看,gcc中的线程本地存储是内联的,本身不应该招致性能损失。我能想到的唯一缺点是objToStr2的缓存局部性比线程局部性要好C++ 线程本地变量和堆栈分配变量之间的性能,c++,c,performance,gcc,thread-local,C++,C,Performance,Gcc,Thread Local,我只是想知道,因为objtost在语法上必须更易于使用,而且从我的基础研究来看,gcc中的线程本地存储是内联的,本身不应该招致性能损失。我能想到的唯一缺点是objToStr2的缓存局部性比线程局部性要好 还有其他想法吗?那是比较苹果和机器人。语义不同objToStr是不可重入的,而objToStr2是可重入的。您是否认真关心这类代码的性能?如果它使用线程本地存储,它如何不可重入?需要详细说明吗?只要您在\u Thread\u local的开销中使用snprintf,就应该完全可以忽略不计。@Wa
还有其他想法吗?那是比较苹果和机器人。语义不同
objToStr
是不可重入的,而objToStr2
是可重入的。您是否认真关心这类代码的性能?如果它使用线程本地存储,它如何不可重入?需要详细说明吗?只要您在\u Thread\u local
的开销中使用snprintf
,就应该完全可以忽略不计。@Walter使用snprintf是为了演示,我得到的是使用传入字符缓冲区与线程本地字符缓冲区。
static const char* objToStr(Obj o)
{
static __thread char s[64];
snprintf(s, sizeof(s), "Obj: ...", ...);
return s;
}
static const char* objToStr2(Obj o, char* s, size_t len)
{
snprintf(s, len, "Obj: ...", ...);
}
int main()
{
Obj o;
...
const char* s1 = objToStr(o);
char buf[64];
const char* s2 = objToStr2(o, s2, sizeof(buf));
}