繁体   English   中英

关于静态变量的C ++参考

[英]C++ reference on static variable

我只是发现这个小小的C ++代码并没有给我与clang ++和g ++相同的结果:

#include <iostream>
#include <string>

using namespace std;

const string& createString(char c) {
    static string s;
    s="";
    for(int i=0; i<10; ++i) {
    s+=c;
    }
    return s;
}

int main() {
    cout << createString('a') << ' ' << createString('z') << endl;
    return 0;
}

使用clang ++它写道:

aaaaaaaaa zzzzzzzzzz

就像我想要的那样,但是用g ++写道:

aaaaaaaaa aaaaaaaaa

为什么会这样? g ++实现标准是否合规? 如果我想要一个函数通过像这样的引用返回一个临时的“大”类型,以避免无用的副本,我该怎么办?

是的,两种实现都是兼容的。 未指定函数参数的评估顺序。

因此,可以按任何顺序计算createString('a')createString('z') 此外,可以在写出createString('a')的结果之前或之后评估createString('z')

由于该函数是有状态的,并且通过引用返回状态,因此两个输出都是允许的, zzzzzzzzzz zzzzzzzzzz也是zzzzzzzzzz zzzzzzzzzz

最后,值得注意的是, static状态将是多线程环境中的主要问题。

如果我想要一个函数通过像这样的引用返回一个临时的“大”类型,以避免无用的副本,我该怎么办?

它不会。 RVO和NRVO可以轻而易举地解决这个问题。 另外,移动语义。 简而言之,根据值返回std::string没有任何问题。

如果我想要一个函数通过像这样的引用返回一个临时的“大”类型,以避免无用的副本,我该怎么办?

每个表达只调用一次。 例如,这将正常工作:

std::cout << createString('a') << ' ';
std::cout << createString('z') << std::endl;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM