本帖最后由 Ph-苯 于 2022-12-9 13:52 编辑
书接上回:暗地里到底没了多少?🧐
大雾
Kotlin (JVM):
C++:
经群友提醒,在C++用内联再试了一遍:
经群友和坛友提醒,对第二版C++代码开启O2优化,结果控制台输出变成0了……把循环次数改成0xffffffffffffffff,输出还是0。把第一版C++代码启用O2优化,循环次数也改成0xffffffffffffffff,输出也变成0了。我怀疑这部分代码直接被优化没了。
刚刚发现C++我写的赋值运算符函数是错的,导致其没有赋值。我把x和y都改成非const,并使用默认的赋值运算符函数:
开O2优化,控制台输出:0
不出所料,O2优化把无副作用的循环给优化掉了……
我把主函数改成这样:
O2优化果然了得。
书接上回:暗地里到底没了多少?🧐
大雾
Kotlin (JVM):
控制台输出:280
C++:
控制台输出:2379
经群友提醒,在C++用内联再试了一遍:
控制台输出:1397
经群友和坛友提醒,对第二版C++代码开启O2优化,结果控制台输出变成0了……把循环次数改成0xffffffffffffffff,输出还是0。把第一版C++代码启用O2优化,循环次数也改成0xffffffffffffffff,输出也变成0了。我怀疑这部分代码直接被优化没了。
刚刚发现C++我写的赋值运算符函数是错的,导致其没有赋值。我把x和y都改成非const,并使用默认的赋值运算符函数:
不开O2优化,控制台输出:2484
开O2优化,控制台输出:0
不出所料,O2优化把无副作用的循环给优化掉了……
我把主函数改成这样:
控制台输出第一行:23
O2优化果然了得。
本帖最后由 src_resources 于 2022-12-9 13:11 编辑
因为C++是在C语言的基础上引入了很多更先进的语法和功能,因此编译器处理后,因为要转换为与C语言对等的可执行二进制文件,因此可能会塞很多未知的等效代码段进去以达到目的,进而造成不必要的延时。
曾经在Ubuntu上用g++试过一次,加上-S选项看了等效汇编代码后和意想当中的完全是两面,本来一个类似于楼主这样的简单for循环,被g++,只需要一些cmp和jnz等指令就可以实现,硬是被它塞了很多自己的segment,再调用对应的预设代码段来实现。还有很多奇怪的变量名只有编译器自己能懂,我看不懂,像极了IT公司里面看同事代码的样子。
另外楼主也可以尝试开启 -O2 选项,再看看用时是多少。
因为C++是在C语言的基础上引入了很多更先进的语法和功能,因此编译器处理后,因为要转换为与C语言对等的可执行二进制文件,因此可能会塞很多未知的等效代码段进去以达到目的,进而造成不必要的延时。
曾经在Ubuntu上用g++试过一次,加上-S选项看了等效汇编代码后和意想当中的完全是两面,本来一个类似于楼主这样的简单for循环,被g++,只需要一些cmp和jnz等指令就可以实现,硬是被它塞了很多自己的segment,再调用对应的预设代码段来实现。还有很多奇怪的变量名只有编译器自己能懂,我看不懂,像极了IT公司里面看同事代码的样子。

另外楼主也可以尝试开启 -O2 选项,再看看用时是多少。