C ++代码中奇怪的未使用静态字符串声明

时间:2018-06-25 16:23:40

标签: c++ optimization static

今天,在一个受欢迎的问题解决站点中,我提交了一个问题的解决方案,然后查找了一个更快的代码,以查明他/她的代码比我的代码运行得更快的原因。总体算法是相同的,但是我发现的主要区别如下。

static string x = [](){
    std::ios::sync_with_stdio(false);
    cin.tie(nullptr);
    return "";
}();

我也不明白cin.tie(nullptr)在这里做什么。我读到了

ostream* tie (ostream* tiestr);

但无法弄清楚这行在这里做什么。

请注意,我已经知道std::ios::sync_with_stdio(false)不再浪费时间来将printf/scanf的I / O操作与C ++计数器部分cin/cout同步。

我已经猜到了,甚至在主函数运行之前,块中的代码都已执行,但是我不知道该构造背后的真正原因是什么。

对不起,我的英语不好,非常感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

您猜到了大多数:

  • 通过使用lambda初始化静态变量来在main之前执行
  • 它禁用与I / O相关的操作,这些操作会减慢执行速度:
    • std::ios::sync_with_stdio
    • cin.tie(nullptr)将使cincout解除绑定。见下文
  • 初始化这样的字符串并不昂贵,因为它不会导致为空字符串分配堆

来自cplusplus.com:

  

绑定流是一个输出流对象,该对象在刷新之前   该流对象中的每个I / O操作

我想这个问题来自cin的输入,并且您在cout上提供了答案,从现在开始,写入cout会更快。