只是想知道是否有人會爲我確認一些別名規則。C++別名規則
我知道,混疊(即加載存儲問題)可能導致以下類型的代碼是次優的,因爲我們不能假設x, y, z
不重疊:
// case 1:
void plus(size_t n, double *x, double *y, double *z)
{
for (size_t i = 0; i != n; ++i)
z[i] = x[i] + y[i];
}
我知道這有一個C關鍵字__restrict
這暗示到,它不應該考慮重疊的情況下,編譯,因此潛在生成更好的代碼:
// case 2:
void plus(size_t n, double *__restrict x, double *__restrict y, double *__restrict z)
{ // as above... }
但是別名如何處理C++風格的代碼,我們將在那裏處理通過引用傳遞的容器對象,而不是上面類似於C的示例中的原始指針?
舉例來說,我猜想會有走樣的問題,如果我們做了以下內容:
// case 3:
void plus(std::vector<double> &x, std::vector<double> &y, std::vector<double> &z)
{ // similar to above... }
並移動到一個不太簡單的例子,這有什麼區別,如果基礎數據類型容器是不同的?在執行層面最集裝箱動態管理與指針存儲,所以它不是很清楚,我的編譯器如何能確保以下不別名:
// case 4:
void foo(std::vector<mytype1> &x, std::vector<mytype2> &y)
{ // interwoven operations on x, y... }
我並不想對微型優化,但我想知道現在是否更好地將限制指針傳遞到容器周圍,而不是引用。
編輯:清除一些術語,如指出:restrict
是C99關鍵字。在各種編譯器中也有__restrict
和__restrict__
,但它們都做同樣的事情。
對於容器的例子,除非'&x ==&y'我不相信它們有任何可以重疊的方式,假設符合標準的矢量實現。 – Sven 2011-06-12 07:52:05
@Sven:不同的std :: vector不重疊,但是通常你可以通過引用傳遞任何對象類型,可能是重疊的。所以我希望編譯器需要確保正確性,並保守假設有別名。這就是爲什麼__restrict進來... – 2011-06-12 07:59:13
@Darran:實際上編譯器會做矢量優化或什麼時候傳遞一個對象重載operator [],而不是一個實際的數組或指針?不知何故,我懷疑它。 – Sven 2011-06-12 08:09:03