c++ - fputc 性能和优化

标签 c++ c

我在编写的程序中看到了一些我无法真正解释的奇怪行为,我想知道是否有人可以向我解释这里发生的事情。我感觉这是由 g++ 与 -O3 一起使用的一些高级优化技术引起的,但我不确定。

我正在运行类似的东西(不是完整的例子):

char* str = "(long AB string)"; // string _only_ consisting of As and Bs 
size_t len = strlen(str);
for(unsigned long offset = 0; offset < len; offset++) {
    if(offset % 100 == 0) fputc('\n', f);
    fputc(str[offset], f);
}

这相当慢。但是,当我像这样额外检查字符时,它突然变得非常快:

char* str = "(long AB string)"; // string _only_ consisting of As and Bs 
size_t len = strlen(str);
for(unsigned long offset = 0; offset < len; offset++) {
    if(offset % 100 == 0) fputc('\n', f);
    if(str[offset] != 'A' && str[offset] != 'B') exit(1);
    fputc(str[offset], f);
}

这是尽管字符串只由As和Bs组成,所以写入的字符数没有变化,程序总是正常退出。

谁能给我解释一下这里发生了什么?字符检查是否允许优化器对 str[offset] 做出一些原本无法做出的假设,从而优化 fputc 调用的某些部分?

最佳答案

编译器将所有东西优化成一个简单的

exit(1)

因为编译器足够聪明,可以识别字符串常量“(长字符串)”不包含任何“A”或“B”。

坦率地说,我没想到 gcc 会检测到它 ;)

关于c++ - fputc 性能和优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22442825/

相关文章:

c++ - 为什么 'virtual' 继承不是默认行为?

c - 处理 C "if "条件下溢 - 使用 boolean 值

c - 为什么 2 比较大于 2,5?

c++ - 使用 C++ 合并 .reg 文件

c++ - Windows 上的 LALR(1) 或 GLR - 当前的 Bison++/Flex++ 替代品?

c++ - 使用 boost::asio 的 HTTP POST 请求

带有 regexec() 的 C++ 正则表达式不匹配

c - malloc、sizeof 和 strlen 函数可能发生冲突吗?

C:使用输入和数组时出现数学结果问题。

C 这个语法是字典吗?