我第一次尝试使用C++ 11 unique_ptr
; 我正在替换我的一个项目中的多态原始指针,该指针由一个类拥有,但经常传递.
我以前的功能如下:
bool func(BaseClass* ptr, int other_arg) {
bool val;
// plain ordinary function that does something...
return val;
}
Run Code Online (Sandbox Code Playgroud)
但我很快意识到我无法切换到:
bool func(std::unique_ptr<BaseClass> ptr, int other_arg);
Run Code Online (Sandbox Code Playgroud)
因为调用者必须处理函数的指针所有权,所以我不想这样做.那么,什么是我的问题的最佳解决方案?
我虽然将指针作为参考传递,如下所示:
bool func(const std::unique_ptr<BaseClass>& ptr, int other_arg);
Run Code Online (Sandbox Code Playgroud)
但是我觉得这样做非常不舒服,首先是因为传递已经输入的内容似乎并非本能,_ptr
作为参考的参考.其次,因为功能签名变得更大.第三,因为在生成的代码中,需要两个连续的指针间接来达到我的变量.
在为本机平台开发时,我可以使用ldd列出所有共享库(.so文件)我构建的二进制可执行文件将在启动时尝试加载.但是当交叉编译时,我不知道如何获得相同的信息.这ldd
不是一个普通的binutils实用程序,比如strip
或者ar
,可以和gcc
交叉编译一起构建,但相反,它是一个神秘的shell脚本,显然只能在本机平台上运行.
那么,使用跨目标binutils工具,有没有办法获得外部二进制文件的动态链接依赖项列表?
我正在使用OpenGL ES 2.0,但我认为它也与非ES有关:如何知道在创建VBO时选择什么"用法"?
这个特殊的VBO将在完全更新之前使用1到4次,我不确定是否必须选择GL_STREAM_DRAW或GL_DYNAMIC_DRAW.
我写了这个SOR求解器代码.不要太费心这个算法做什么,这不是关注点.但仅仅是为了完整性:它可以解决线性方程组,这取决于系统的条件有多好.
我用一个病态的2097152行sparce矩阵(从不收敛)运行它,每行最多7个非零列.
翻译:外部do-while
循环将执行10000次迭代(我传递的值为max_iters
),中间for
将执行2097152次迭代,分割成块work_line
,在OpenMP线程之间划分.最里面的for
循环将有7次迭代,除非极少数情况下(小于1%)它可以更少.
sol
数组值中的线程之间存在数据依赖性.中间的每次迭代都会for
更新一个元素,但最多可读取数组的其他6个元素.由于SOR不是一个精确的算法,在读取时,它可以具有该位置上的任何先前值或当前值(如果您熟悉求解器,这是一个Gauss-Siedel,在某些地方容忍Jacobi行为,为了并行).
typedef struct{
size_t size;
unsigned int *col_buffer;
unsigned int *row_jumper;
real *elements;
} Mat;
int work_line;
// Assumes there are no null elements on main diagonal
unsigned int solve(const Mat* matrix, const real *rhs, real *sol, real sor_omega, unsigned int max_iters, real tolerance)
{
real *coefs = matrix->elements;
unsigned int *cols = matrix->col_buffer;
unsigned int *rows = matrix->row_jumper;
int size = matrix->size;
real …
Run Code Online (Sandbox Code Playgroud) c multithreading openmp computer-architecture multiprocessing
我正在开发一个宠物开源项目,它实现了一些流密码算法,我遇到的问题只有在我在ARM处理器上运行时才会触发.我甚至尝试在qemu下运行x86中的ARM二进制文件,但是那里没有触发bug.
这个bug的具体机制仍然是难以捉摸的,但我最好的办法是相信它是由我的程序中未对齐的内存访问尝试引起的,这是由qemu实现的,但是我的开发板中真正的ARM处理器默默地忽略了它.
因此,由于问题显示非常难以诊断,我想知道是否有任何工具可用于捕获我运行的程序所做的未对齐内存访问,以便我可以确切地看到问题发生的位置.
我还可以使用某种方式在我的ARM开发板上启用一些信号(SIGBUS,可能?),如果进程违反了内存对齐限制,就像我们在访问未映射的内存地址时得到SIGSEGV一样.它运行的是Linux 2.6.32.
以下最小代码在g ++上编译,但不会在clang ++上编译:
template<class T>
T operator*(float a, const T& b)
{
return b * a;
}
struct A{
A operator*(float b) const
{
A a;
return a;
}
};
int main()
{
A a;
2.0f * a;
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
$ clang++ test.cpp
test.cpp:2:3: error: overloaded 'operator*' must have at least one parameter of
class or enumeration type
T operator*(float a, const T& b)
^
test.cpp:4:11: note: in instantiation of function template specialization
'operator*<float>' requested here
return b * a; …
Run Code Online (Sandbox Code Playgroud) 有谁知道如何跨ARM编译OpenSSH?这就是我所做的:
首先,我已经下载了Zlib源代码,解压缩它,构建它并使用以下命令行安装它:
# ./configure --prefix=/usr/local/cross/arm
# make
# make install
Run Code Online (Sandbox Code Playgroud)
但是当我尝试为ARM目标板编译OpenSSH时,它会在此./configure
过程中给出错误"zlib missing" :
# sudo LDFLAGS=-L/usr/local/cross/arm/lib CC=arm-none-linux-gnueabi-gcc PATH=$PATH:/home/arishop/arm-tool-chain/arm-fsl-linux-gnueabi/bin/ ./configure --host=arm-linux --with-zlib=/usr/local/cross/arm/ --prefix=/usr/local/cross/arm/openssh
Run Code Online (Sandbox Code Playgroud) 我有一个通过Autoconf配置的项目,我想在这个项目中开始使用C++ 11功能.如何始终启用"-std = gnu ++ 0x"开关并支持配置时检查的功能?
在本文中,它说下面的代码是有效的C++ 11,并与GNU的libstdc ++一起使用:
int n;
std::vector<int> v;
...
std::function<bool(int)> f(std::cref([n](int i) {return i%n == 0));
std::count_if(v.begin(), v.end(), f);
Run Code Online (Sandbox Code Playgroud)
问题是我离开了相信要在调用站点创建的lambda对象,什么会使它成为此片段中的临时对象,因为它不存储在任何变量上,而是const
创建并传递给它的引用这个std::function
.如果是这样的话,lambda对象应该一直被销毁,留下一个悬空引用f
,这将导致使用时的未定义行为std::count_if
.
假设文章没有错,我的心理模型有什么问题?当lambda对象被破坏时?