gpt4 book ai didi

c++ - fputc 性能和优化

转载 作者:太空宇宙 更新时间:2023-11-04 03:48:38 27 4
gpt4 key购买 nike

我在编写的程序中看到了一些我无法真正解释的奇怪行为,我想知道是否有人可以向我解释这里发生的事情。我感觉这是由 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com