C++ 线程本地变量和堆栈分配变量之间的性能

C++ 线程本地变量和堆栈分配变量之间的性能,c++,c,performance,gcc,thread-local,C++,C,Performance,Gcc,Thread Local,我只是想知道,因为objtost在语法上必须更易于使用,而且从我的基础研究来看,gcc中的线程本地存储是内联的,本身不应该招致性能损失。我能想到的唯一缺点是objToStr2的缓存局部性比线程局部性要好 还有其他想法吗?那是比较苹果和机器人。语义不同objToStr是不可重入的,而objToStr2是可重入的。您是否认真关心这类代码的性能?如果它使用线程本地存储,它如何不可重入?需要详细说明吗?只要您在\u Thread\u local的开销中使用snprintf,就应该完全可以忽略不计。@Wa

我只是想知道,因为objtost在语法上必须更易于使用,而且从我的基础研究来看,gcc中的线程本地存储是内联的,本身不应该招致性能损失。我能想到的唯一缺点是objToStr2的缓存局部性比线程局部性要好


还有其他想法吗?

那是比较苹果和机器人。语义不同
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));
}