小编Mic*_*ael的帖子

在需要引用时传递指针

我有以下两个功能:

void B::set(A * ptr){
  this->a = ptr;
  this->info = get_some_info_from_a(*ptr);
}

T get_some_info_from_a(A& ref){
  return ref.info;
}
Run Code Online (Sandbox Code Playgroud)

如你所见,我将A*ptr作为set(...)中的指针,但我需要一个引用来调用get_some_info_from_a(...).所以我取消引用ptr并将其作为一个参数.

那是对的吗?是否有效,因为A有一些必须由复制/移动构造函数复制的资源?我问这个问题,因为这条线似乎真的引入了一些神秘的错误.

c++ pointers reference

1
推荐指数
1
解决办法
54
查看次数

请求有关C++ 11中最先进文件读取的示例

有大量关于网络上文件阅读的例子.许多示例使用普通的旧C风格文件读取.其他示例使用C++的东西,但我不知道它是否只是另一个普通程序员编写教程或者它是否是真正优秀的现代C++.

所以,问题是:现在一个优秀的C++程序员如何解决以下任务?

  1. 从二进制文件中读取一些表示单个原始类型变量的字节.
  2. 读取已知(但不是常数)长度的已知基本类型的数组.
  3. 当类型尚未知道时读取字节数组,但已知长度(以字节为单位).例如,如果从文件中读取数组,然后将其传递给实际从中构建对象的函数.

c++ stl binaryfiles

1
推荐指数
1
解决办法
108
查看次数

复制构造函数,constness和rvalues

我目前正在学习移动/复制构造函数,constness和rvalues.

关于C++的"旧文献"说:

"复制构造函数必须采用const参数,因为它应该能够采用不可修改的temporaries/rvalues"

但是现在,使用C++ 11的移动构造函数,我们可以直接处理rvalues.这让我得出结论,使复制构造函数采用const引用不再是强制性的.

这是真的?(我既不能用现有的文献和社区文章来证实也不能伪造该陈述.)关于拥有复制构​​造函数const的pro和contras的简短讨论也将受到赞赏.

c++ const

1
推荐指数
1
解决办法
63
查看次数

如何使用LD_LIBRARY_PATH和链接真的正确?

我一再遇到没有找到的库的问题.

在我的bashrc中我有:

LD_LIBRARY_PATH=
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib1
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib2
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib3

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH
Run Code Online (Sandbox Code Playgroud)

这些路径包含所有文件夹,我使用-L/lib1 -l1a -L/lib2 -l2a -L/lib3 -l3a将库链接到我的程序.

现在我独立开始我的程序:

./program
Run Code Online (Sandbox Code Playgroud)

精细!

然后我从mpich的mpiexec开始吧:

/mpich/intel/bin/mpiexec -np 2 ./solvertest1
Run Code Online (Sandbox Code Playgroud)

精细!

然后我启动gdb启动它:

/mpich/intel/bin/mpiexec -np 2 gdb ./solvertest1
Run Code Online (Sandbox Code Playgroud)

问题,找不到库:

Starting program: /my/program
/my/program: error while loading shared libraries: libirng.so: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我怀疑LD_LIBRARY_PATH应该通过所有子进程传播并且那些脚本和程序产生的shell会出现问题...我需要做什么才能让每个子进程(以及其他任何将被启动的)知道这些库的位置?

c++ bash mpi dynamic-linking ld

1
推荐指数
1
解决办法
1145
查看次数

通过void*和reinterpret_cast从字节字段读取

我计划Tvoid*以下方式给出的字节字段中读取一个类型:

template <class T>
T read(void* ptr){
    return reinterpret_cast<T>(*ptr);
}
Run Code Online (Sandbox Code Playgroud)

但我有些疑惑:解除引用void*实际上是reinterpret_cast<T>什么?只是那个位置的字节?或"神奇地"长度的字节序列T?我应该先void*投入一个T*吗?

c++ pointers void-pointers reinterpret-cast

1
推荐指数
1
解决办法
60
查看次数

通过模板参数类中的静态值专门化功能模板

我有功能op,我想专门为模板参数的所有情况PROCESSOR::DIMENSION = 2.这是可能的,或者我怎么能实现类似的东西?

// How to specialize this for all PROCESSOR with DIMENSION = 2?
template <class PROCESSOR>
void op(Node<PROCESSOR>& node){

}


// this is an example for template parameter PROCESSOR
template <int DIM>
class CPU
{
    public:
        static int DIMENSION = DIM;

};
Run Code Online (Sandbox Code Playgroud)

(如果你怀疑XY问题,你可能是对的.我在这里有一个相对复杂的设计任务,我正在评估不同的想法如何去做.其中一个导致上面的X.特别是,我试图避免多态指针,因为它们会阻止编译器内联,我们正在谈论高性能应用程序的非常小的代码片段.)

c++ templates

1
推荐指数
1
解决办法
42
查看次数

编译器将(不相关的)模板的名称与方法名称混淆

我在以下代码中有一个编译错误.似乎编译器将类方法解释set为一个模板 - 乍一看 - 与我的代码完全无关.

#include <cassert>
#include <limits>

using namespace std;

template <class T>
class ReduceScalar{

    public:
        T get() { return *r; };
        void set(T t) { *r = t; };
        void set(T* t) { r = t; };

    private:
        T* r;

};

template <class T>
class ReduceSum : public ReduceScalar<T>
{
    public:
        ReduceSum(T* target) { set(target); set(0); } // COMPILE ERROR


};
Run Code Online (Sandbox Code Playgroud)

编译器给出以下错误:

../test/../io/scalarreducers.h:34:26: error: use of class template 'set' requires template arguments
                ReduceSum(T* target) { …
Run Code Online (Sandbox Code Playgroud)

c++ templates dependent-name

1
推荐指数
1
解决办法
78
查看次数

当我可以将对象的实际类型指定为模板参数时,内联虚函数

我有一个虚拟类Calculator和该类的示例实现MyCalculator.

template <class T>
class Calculator{
    virtual void op1() = 0;
};

template <class T>
class MyCalculator : public Calculator{
    void op1(){ do_something(); }
};
Run Code Online (Sandbox Code Playgroud)

当我使用op1()以下函数中演示时,编译器当然不能内联,op1()因为它是虚拟的:

void calculate(Calculator* calc){
    calc->op1();
}
Run Code Online (Sandbox Code Playgroud)

但是,在某些情况下,我知道calcAND 的实际类型,因为性能原因需要内联.所以我想到了以下想法:

template <class C>
void calculate(C* calc){
    calc->op1();
}
Run Code Online (Sandbox Code Playgroud)

我会调用这个函数,如下所示:

Calculator c1 = new Calculator();
calculate(c1); // no inling possible in calculate(...)

MyCalculator c2 = new MyCalculator();
calculate(c2); // inlining possible in calculate(...) ?
Run Code Online (Sandbox Code Playgroud)

在第一个例子,内联是不可能的,但我认为在第二个例子中,op1()MyCalculator …

c++ templates inlining

1
推荐指数
1
解决办法
36
查看次数

设置Matlab中数据采集器可以选择的内容

我在Matlab中有一个plot和一个scatter3相同的图.该plot只是用来作为"装饰",而scatter3包含实际数据.但是当我点击一个数据点来查看它的值时,它通常会粘在一个元素上plot.

有没有办法设置数据光标只能粘贴到绘制的元素scatter3而不是绘图?

就像是:

plot(..., dataCursorCanNotStick)
hold on
scatter3(..., dataCursorCanStick)
Run Code Online (Sandbox Code Playgroud)

matlab

1
推荐指数
1
解决办法
33
查看次数

SVG 字体大小相对于 viewBox 大小

假设我有以下简单的 SVN:

<svg viewBox="-3 -3 6 6 ">
   <circle cx="1" cy="1" r="0.2"/>
</svg>
Run Code Online (Sandbox Code Playgroud)

现在我想在圆圈旁边添加一个文本,它与圆圈具有相同的高度,在所选坐标系中为 0.2。

我怎样才能做到这一点?

svg

1
推荐指数
1
解决办法
2559
查看次数

制作一个简单的makefile泛型

我有一个简单的makefile来帮助我编译一些例子:

   ex104: ex104.cpp
        $(CPP) ex104.cpp $(INCS) $(LINKFLAGS) $(COMPILEFLAGS) -o ex104  

   clean:   
        rm -f *.o $(EXECUTABLE)
Run Code Online (Sandbox Code Playgroud)

现在,这很好.问题是:我需要为每个示例明确编写规则,因此复制以下行很多次:

   ex104: ex104.cpp
        $(CPP) ex104.cpp $(INCS) $(LINKFLAGS) $(COMPILEFLAGS) -o ex104
Run Code Online (Sandbox Code Playgroud)

有没有办法将它泛化一点?所以,我最终会象下面这样将建立一个命令行ex252ex252.cpp自动生成:

make ex252
Run Code Online (Sandbox Code Playgroud)

幸运的是,它是一个仅模板库,因此我总是只需要从一个cpp文件构建,而且我不需要跟踪目标文件.

c++ makefile

1
推荐指数
1
解决办法
593
查看次数

在内核中使用cudaDeviceSynchronize()进行全局同步

我刚刚阅读了有关动态并行性的文档.我想知道:我可以cudaDeviceSynchronize()在内核中使用同步当前在该设备上运行的所有块吗?

文件说:

来自任何线程的CUDA运行时操作(包括内核启动)在线程块中都是可见的.这意味着父网格中的调用线程可以对由该线程启动的网格,线程块中的其他线程或在同一线程块内创建的流执行同步.

此外:

在网格中创建的流和事件存在于线程块范围内,但在创建它们的线程块之外使用时具有未定义的行为.

这对我的问题基本上是不对的.但是因为cudaDeviceSynchronize()整个设备使用全局流,我不确定该流是否可见,并且设备上的所有线程都是相同的,无论它们属于哪个块或启动.这样我就可以cudaDeviceSynchronize()在内核中实际进行全局同步.

cuda

0
推荐指数
1
解决办法
1441
查看次数

glPointSize(...) 在较新的 OpenGL 版本中不再可用?

我观察到无论我启用还是禁用GL_PROGRAM_POINT_SIZEglPointSize(...)在我的主程序中总是被忽略,着色器代码行gl_PointSize = ...总是决定点的大小。

这是较新 OpenGL 版本的预期行为,还是我必须怀疑我的代码中存在错误?

opengl

0
推荐指数
1
解决办法
437
查看次数