![]() |
1
5
这可能是一个别名问题-编译器不知道实例变量
|
![]() |
2
3
MSVC是正确的,因为它是唯一一个,考虑到我们所看到的代码,能够保证正确工作的代码。GCC使用的优化可能是安全的 在这个特定的实例中 ,但这只能通过查看更多程序来验证。
因为
GCC发现它实际上没有别名
当然可以实例化类,以便
假设
因为函数循环
所以,最有可能的是,海湾合作委员会只是简单地通过将整个事情纳入其中,并看到了这一点而逃脱了惩罚。 在这种情况下 他们没有化名。 |
![]() |
3
2
我用MSVC反汇编了代码,以便更好地理解正在发生的事情。事实证明,别名根本不是问题,也不是某种偏执的线程安全问题。
这是
对于未优化的成员函数版本,
反汇编是(很难找到,因为编译器将它内联到
注意2件事:
最后,这里是成员函数的“优化”版本,
(同样,内联)拆卸是:
这里的循环是展开的,但只有x2个。 这很好地解释了我的速度差观测。对于175e6数组,函数运行~1.2秒,未优化成员运行~1.5秒,优化成员运行~1.3秒。(请注意,这可能对您有所不同,在另一台机器上,所有3个版本的运行时间都比较接近)。
海湾合作委员会呢?当用它编译时,所有3个版本都以大约1.5秒的速度运行。我怀疑没有展开
|
![]() |
4
1
正如Paul所写,这可能是因为sm成员每次在“真实”内存中都会被更新,同时函数中的局部摘要可以在寄存器变量中累积(在编译器优化之后)。 |
![]() |
5
0
当传入指针参数时,可能会遇到类似的问题。如果你喜欢把手弄脏,你会发现
|
![]() |
6
0
这根本不是同一个代码。如果您将sm、arr和sz变量放在类中,而不是将主题设置为本地的,编译器就不能(很容易)猜测其他类不会继承自
最后,原因基本上是保罗指出的,SM在使用类成员时在实际内存中更新,在函数中可以存储在寄存器中。从add读取的内存不应该改变结果时间太多,因为必须读取memomry才能获得值。 在这种情况下,如果测试没有导出到另一个模块,并且没有别名,即使是间接地导出到某个模块,并且没有类似上面的别名。编译器可以优化对sm的中间写入…一些编译器(如gcc)似乎已经足够积极地进行了优化,以检测上述情况(如果导出测试类,是否也会这样做)。但这些都是很难猜测的。编译器还没有执行更简单的优化(比如通过不同的编译单元进行内联)。 |
![]() |
7
0
关键可能是
问题就在这里:所有的类成员都可以通过
为什么会这样?据我所知
我并不惊讶你问题中的优化(使用局部变量)没有实现——不仅编译器必须证明
|
![]() |
AstralHex · 矩阵乘法代码工作不正常 7 月前 |
![]() |
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 7 月前 |
![]() |
Die4Toast · 递归调用成员箭头运算符-> 7 月前 |
![]() |
Anka Hanım · 关于结构和动态数组地址的问题 7 月前 |