简短问题:
是否有为什么C ++ STL实现使用一个原因vector_base结构/类(到手柄资源和分配器),为基类的std::vector,而不是使用组合物?
较长版本:
在提高我对C ++的了解的“任务”中,我一直在尝试重新实现一个Vector大多数是std::合规的类。我想我已经足够了解为什么使用分配器明智,为什么您实际上希望将所有内存处理放在单独的类/结构(RAII等)中,但我看不到为什么我们std::vector要从中继承类,而不是将其作为私人成员。
例如,LLVM和gcc都使用继承。另一方面,我发现构造函数和赋值运算符(尤其是move-types)使用合成更容易处理。
我只是公开我对语言的肤浅知识吗?
举例来说,我搜索了一本教科书,发现Stroustroup的书与他的2013年的“ C ++编程语言,第四版”对标准的“模拟重新实现”有不同的版本(只是让我更加困惑!)。使用构图及其2014年的“编程:原理与实践,第二版”。使用继承!
任何人都可以帮助我阐明一些想法吗?
TLDR; 对于那些想要避免阅读整个故事的人:有没有办法将RcppArmadillo与NVBLAS连接起来使用GPU,更像是使用纯粹的c ++代码而不是R来将Armadillo与NVBLAS接口?
我正在尝试利用NVBLAS库(http://docs.nvidia.com/cuda/nvblas/)来加速我的项目中的线性代数部分(主要是计算统计,MCMC,粒子滤波器和所有那些好东西) )通过将一些计算转移到GPU.
我主要使用C++代码,特别是用于矩阵计算的Armadillo库,通过他们的常见问题我知道我可以通过正确的方式链接犰狳来使用NVBLAS(http://arma.sourceforge.net/faq.html).
所以我设置了我的库安装并编写了以下虚拟编程:
#include <armadillo>
int main(){
arma::mat A = arma::randn<arma::mat>(3000,2000);
arma::mat B = cov(A);
arma::vec V = arma::randn(2000);
arma::mat C; arma::mat D;
for(int i = 0; i<20; ++i){ C = solve(V,B); D = inv(B); }
return 0;
}
Run Code Online (Sandbox Code Playgroud)
用它编译它
g++ arma_try.cpp -o arma_try.so -larmadillo
Run Code Online (Sandbox Code Playgroud)
和配置文件
nvprof ./arma_try.so
Run Code Online (Sandbox Code Playgroud)
分析器输出显示:
==11798== Profiling application: ./arma_try.so
==11798== Profiling result:
Time(%) Time Calls Avg Min Max Name
72.15% 4.41253s 580 7.6078ms 1.0360ms 14.673ms void magma_lds128_dgemm_kernel<bool=0, bool=0, …Run Code Online (Sandbox Code Playgroud)