基本功能:
template <typename T>
T** shifting (T* in, int size, int dist, int pos) {
auto out = new T* [size];
int k = (pos-1) * size/dist;
for (int i{0}; i < size; i) {
if (i k >= size) {
out[i] = &in[k i-size];
} else {
out[i] = &in[k i]
}
}
return out;
}
此功能是創建指標陣列出陣列的元素在特定的順序,我想知道是否有將與存盤器操作更快的辦法,所以我嘗試不同的東西。
新功能:
template <typename T>
T** stuff(T* in, int size, int dist, int pos) {
int helper = size/dist;
auto out = new T* [size];
for (int i{0}; i < dist; i ) {
if (pos i < size) {
memcpy(out i - pos dist, in i*helper, helper * sizeof(T*));
} else {
memcpy(out i - pos, in i*helper, helper * sizeof(T*));
}
}
return out;
}
然而,這并沒有給出地址陣列,而是將地址后面的值轉換為指標,因此我將元素的值作為指標獲取。仔細檢查后,這種行為不應該是其他情況,但我想不出讓它發揮作用的方法。
謝謝你的幫助。
uj5u.com熱心網友回復:
您的新回圈體(在您編輯之前,但我的分析基本保持不變)是:
memcpy(out i - pos (pos i < size ? dist: 0), in i*helper, helper * sizeof(T*));
擴展它的可讀性(這不會??影響性能,所以你也應該這樣做):
T** dest = out i - pos (pos i < size ? dist: 0);
T* src = in i * helper;
memcpy(dest, src, helper * sizeof(T*));
通過用型別寫出來,現在你可以看到型別不兼容(T** 和 T*)。您要做的是將地址復制到 的特定位置in,但是您不能像這樣以塊的形式進行復制,因為這些地址在記憶體中還不作為數字存在,您需要創建它們!
最好的辦法是堅持使用更清晰的原始代碼。如果存在性能問題,請告訴我們您正在編譯的優化級別、您使用的輸入大小是多少、此函式花費的時間是多少,以及您的時間預算是多少?
uj5u.com熱心網友回復:
我不知道這是否正是您要找的,但這會運行得更快一些,并且更容易閱讀和推理。
template <typename T>
T** shifting (T* in, int size, int dist, int pos) {
auto out = new T* [size];
int k = (pos-1) * size/dist;
int i, j;
for (i = 0, j = k; i < size - k; i, j)
out[i] = &in[j];
for (j = 0; i < size; i, j)
out[i] = &in[j];
return out;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/360375.html
