正如評論指出的那樣,構造
std::vector<T> A{B.begin(), B.end()};
應該可以正常工作,因爲它可以用於任何兩個迭代器。至於「哪種STL功能是不同的分配器重要?」的問題,有兩種「不同」:
- 不同類型的分配器。
- 具有相同類型的分配器,但比較不同。
對於與(1)不兼容的情況,您應該看到編譯時錯誤,因爲類型系統會捕獲它。對於(2),我不知道STL實現是否可以解決可能存在的問題。在這方面擔心的主要容器/函數是list
類中的splice
方法(和forward_list
類中的splice_after
方法),因爲它們將在一個容器中分配的對象移動到另一個容器。正如C++ 11標準筆記的腳註265所述,STL容器要求分配器比較相等,因此這種移動不應成爲問題。
對於卸載問題,如果A被分配了一個普通的STL分配器,那麼它不能在主機端構造並在協處理器端使用。但是B可以用於雙方。這裏是一個例子,它在協處理器端從它構造出卸載:: shared_allocator , and constructs
A`。
#pragma offload_attribute (push, _Cilk_shared)
#include <vector>
#include "offload.h"
#include <cstdio>
#pragma offload_attribute (pop)
_Cilk_shared std::vector<int, __offload::shared_allocator<int> > B;
_Cilk_shared void foo() {
#ifdef __MIC__
std::vector<int> A(B.begin(),B.end());
for(auto& x: A)
std::printf("%d\n", x);
#else
std::printf("Host\n");
#endif
}
int main() {
auto y = 1;
for(int i=0; i<10; ++i) {
B.push_back(y);
y *= 10;
}
_Cilk_offload foo();
}
它應該打印:
1
10
100
1000
10000
100000
1000000
10000000
100000000
1000000000
這不是要調用拷貝構造函數。 –
好的,對不起...我會改名爲 – yidiyidawu
只要它們不是平凡的指針,不是'std :: vector> :: iterator'是不同於'std: :vector > :: iterator'? –