我在CppCon 2014年都是看Mike Acton's talk on Data-oriented design in C++,他給出了這樣的例子:可以``__restrict__這個``不知何故?
int Foo::Bar(int count)
{
int value = 0;
for (int i = 0; i < count; i++) {
if (m_someDataMemberOfFoo) value++
}
return value;
}
,並解釋一些編譯器如何繼續重新閱讀m_someDataMemberOfFoo
在每次迭代中,也許是因爲它的價值可能會因併發訪問。不管編譯器是否適合這樣做 - 是否可以告訴編譯器在執行某種方法時特別忽略任何併發訪問的可能性,以便它可以優化得更好?
換句話說,我可以告訴編譯器:this
是__restrict__
ed嗎?
任何值得使用該名稱的編譯器都會考慮將循環檢出,或至少將'm_someDataMemberOfFoo'保存在寄存器中。任何嘗試使用此代碼同時修改'm_someDataMemberOfFoo'的程序都表現出未定義的行爲。 –
@IgorTandetnik:不一定。這是一個不合理的語義假設。也許'm_someDataMemberOfFoo'應該通過併發修改來改變? – einpoklum
我覺得這個假設在上下文中是合理的。如果'm_someDataMemberOfFoo'是線程安全的(比如說''atomic''),並且期望它會被同時修改,那麼整個問題都是沒有意義的。在某些情況下,「*某些*編譯器會在每次迭代中重新讀取」m_someDataMemberOfFoo「 - 所有編譯器都會這樣做,而且這對他們來說是完全有效且合理的 - 實際上是必需的。 –