2017-05-05 45 views
0

考虑的情况下限制指针访问STL ::向量元素

std::vector<int> v = {0,1,2,3,4,5} ; 
myOpenCLApi(&v[0]);  

其中作为myOpenCLApi(void* ptr);

正如人们可以看到evne虽然它的工作原理分配就好了破抽象是可怕的。我如何阻止我的客户避免这种情况。问题与C++语言功能有关。

+0

你真的不能。有志者,事竟成。 – NathanOliver

+0

这是不可能的。 –

+0

如何创建一个有用的工具,如钢锯,并完全防止其用户危险地使用它? – WhiZTiM

回答

0

你不行。 C++语言是为了给程序员提供工具来解决复杂问题而设计的。它并不是围绕确保程序员无法使用这些工具在脚中自我射击来设计的(或者更确切地说:它并不是围绕设计的,通过使这些工具更安全地使用来牺牲解决复杂问题的能力)。

有一件事你可以要做的就是专注于确保您的公共API是尽可能的安全使用。就你而言,虽然使用场景不是100%清晰,但看起来你正在做的是将数据复制到OpenCL API中,然后在显卡上使用,而且你不希望出现这种情况程序员必须手动计算出传递数据所需的指针算术。

这个最简单的版本将是这个样子:

template<typename T> 
void copyDataToOpenCL(std::vector<T> const& vec) { 
    //There are other things you'll need to do if you're going to use a non-blocking write instead. 
    size_t size = vec.size() * sizeof(T); 
    clEnqueueWriteBuffer(queue, buffer, true, 0, size, vec.data(), 0, nullptr, nullptr); 
} 

/*...*/ 

std::vector<int> v = {0,1,2,3,4,5}; 
copyDataToOpenCL(v); 

这样,你的程序员不必直接与向量,这使得事情更加安全的底层存储结构接口。是的,在事物的底层方面,你仍然在操纵原始指针和数据大小,但是你的程序员在使用这些代码时不会犯错。

当然不过,你仍然程序员可以打破这样的:

std::vector<int> vals = {0,1,2,3,4,5}; 
std::thread ruiner{[&vals]{ 
    while(true) { 
     vals.emplace_back(vals.back() + 1); 
    } 
}}; 
copyDataToOpenCL(vals); 

但是,事情是这样的:你不能100%防止你的程序员从做一些愚蠢的事。你所能做的就是试着证明界面,以便发现更多常见/简单的错误。