覚書 引用 ChatGPT
オリジナル(仮)
for (int i = iStart; i < iEnd; ++i) {
pDst[i] = pSrc[i];
}
高速化版(一行ずつ改変明示)
// 1. restrict でポインタの非エイリアス宣言(ただしC++では非標準。VCなら __restrict 使用)
T* __restrict pS = pSrc + iStart; // 元: pSrc[i]
T* __restrict pD = pDst + iStart; // 元: pDst[i]
int iLen = iEnd - iStart; // 2. 範囲長を事前計算
int i = 0;
int iLen4 = iLen & ~3; // 3. 4の倍数部分まで(ループアンローリング用)
// 4. アンローリングループ(4要素ずつコピー)
for (; i < iLen4; i += 4) {
pD[i ] = pS[i ];
pD[i + 1] = pS[i + 1];
pD[i + 2] = pS[i + 2];
pD[i + 3] = pS[i + 3];
}
// 5. 余り(最大3要素)をコピー
for (; i < iLen; ++i) {
pD[i] = pS[i];
}
コメント付きまとめ
行 内容 説明
1-2 __restrict 使用 ポインタが非エイリアスであると仮定することで最適化しやすくなる(MSVCで効果大)
3 iLen 範囲長を事前に計算し、ループの条件式から差分を排除
4-9 4連アンローリング 実行パイプライン効率化、分岐回数減少
11-13 余り要素処理 長さが4で割り切れない場合の残り処理