考慮這段代碼示例:引用通常被優化掉嗎?
// Static variables
void Object::f_v1()
{
static const int& foo = dataObjectConstRef.dataField.foo;
static const int& bar = dataObjectConstRef.dataField.bar;
static const int& baz = dataObjectConstRef.dataField.baz;
return foo * foo + baz * bar + baz/bar + baz;
}
// References
void Object::f_v2()
{
const int& foo = dataObjectConstRef.dataField.foo;
const int& bar = dataObjectConstRef.dataField.bar;
const int& baz = dataObjectConstRef.dataField.baz;
return foo * foo + baz * bar + baz/bar + baz;
}
// Everything written out
void Object::f_v3()
{
return dataObjectConstRef.dataField.foo * dataObjectConstRef.dataField.foo +
dataObjectConstRef.dataField.baz * dataObjectConstRef.dataField.bar +
dataObjectConstRef.dataField.baz/dataObjectConstRef.dataField.bar +
dataObjectConstRef.dataField.baz;
}
其中哪一個是最好的performancewise,與編譯器的優化已經開啓?
- 靜態版本僅構建一次引用,但總是在此之後檢查互斥鎖。
- 正常參考版本 應該只計算一次地址,但快捷方式是 完全優化了在這個版本或在最後的 版本嗎?
- 如果不是,速度更快,每次檢查互斥鎖的時間是 還是生成引用?
我使用GCC 7.1 -O3。
你爲什麼不看每個函數的生成代碼? –
對我感到羞恥,但我不能讀大會。 –
是否可能或不可能從可能降低可讀性的特定形式中獲得極小的速度增益? – InternetAussie