我有一个C++代码的目录结构,如下所示:
|
|->include
|->src
Run Code Online (Sandbox Code Playgroud)
我正在为我的代码编写一个CMakeLists.txt文件.我想明白之间的差别include_directories,并target_include_directories在CMake.
它们的用法和为了添加我应该使用的包含文件路径有什么区别?
我已经看到了几个关于如何在C++项目中检测不必要的#include文件的问题.这个问题经常引起我的兴趣,但我从来没有找到满意的答案.
如果包含一些头文件,它们没有在c ++项目中使用,那是一个开销吗?我理解这意味着在编译之前,所有头文件的内容都将被复制到包含的源文件中,这将导致大量不必要的编译.
这种开销在多大程度上传播到编译的目标文件和二进制文件?
编译器是否能够进行一些优化以确保不会将此类开销转移到生成的对象文件和二进制文件中?
考虑到事实,我可能对编译器优化一无所知,我仍然想问这个,以防有答案.
作为一名程序员,他的工作使用各种各样的c ++库,我应该遵循什么样的编程实践来避免这种开销?让自己熟悉每个图书馆工作的唯一出路吗?
我的问题源于Scott Meyers 研究Effective C++.在该书的第二项中,写下如下:
要将常量的范围限制为类,必须使其成为成员,并且为了确保最多只有一个常量副本,必须使其成为静态成员.
这是正确的写.然后立即给出以下示例:
class GamePlayer {
private:
static const int NumTurns = 5;
int scores[NumTurns];
....
};
Run Code Online (Sandbox Code Playgroud)
然后写下以下示例:
你在上面看到的是一个声明,而不是NumTurns的定义.
我的第一个问题是:这个陈述的含义是什么?
紧接着提到以下内容:
通常C++要求您为所使用的任何内容提供定义,但是静态和整数类型的类特定常量(例如 - 整数,字符,bools)是一个例外.只要您不接受他们的地址,您就可以声明它们并在不提供定义的情况下使用它们.如果您确实将类的地址设为常量,或者即使您没有使用该地址,您的编译器也错误地坚持定义,您提供了一个单独的定义,如下所示:
const int GamePlayer::Numturns; //definition of NumTurns
为什么现在它是一个定义而不是声明?
我理解函数上下文中的差异,但在常规变量的上下文中不理解它.此外,有人可以扩展作者的意思
...如果你确实把一个类的地址定为常数,或者如果你的......部分引用了上面引用的段落?
PS:我是C++的新手.
我想了解日志库的基础知识.
glog用于记录目的)的目的是什么?我对记录的理解是否正确,还是需要更改?有人能举例说明使用日志库的重要性吗?我一直在使用OpenCV.但是我最近将我的系统更改为我没有任何管理员权限的群集.问题是这样的:
在我的主文件夹中,我安装了FFMPEG(ffmpeg网站上提供的最新稳定版本).我在$ HOME中安装了它,因此在$ HOME/lib中安装了库文件.有关更多信息,我使用以下选项编译了FFMPEG:
./configure --prefix=$HOME --enable-shared --enable-pic
Run Code Online (Sandbox Code Playgroud)
然后我下载了最新的稳定版OpenCV 3.0.0并使用ccmake进行了配置.当我尝试时make -j8,它给了我以下错误.
Scanning dependencies of target opencv_videoio
[ 63%] [ 63%] [ 63%] [ 63%] [ 63%] [ 63%] Building CXX object modules/videoio/CMakeFiles/opencv_videoio.dir/src/cap.cpp.o
Building CXX object modules/videoio/CMakeFiles/opencv_videoio.dir/src/cap_mjpeg_decoder.cpp.o
Building CXX object modules/videoio/CMakeFiles/opencv_videoio.dir/src/cap_images.cpp.o
Building CXX object modules/videoio/CMakeFiles/opencv_videoio.dir/src/cap_v4l.cpp.o
Building CXX object modules/videoio/CMakeFiles/opencv_videoio.dir/src/cap_mjpeg_encoder.cpp.o
Building CXX object modules/videoio/CMakeFiles/opencv_videoio.dir/src/cap_ffmpeg.cpp.o
In file included from /home/uujjwal/libraries/opencv-nogpu/opencv-3.0.0/modules/videoio/src/cap_ffmpeg.cpp:45:0:
/home/uujjwal/libraries/opencv-nogpu/opencv-3.0.0/modules/videoio/src/cap_ffmpeg_impl.hpp:1546:71: error: use of enum 'AVCodecID' without previous declaration
/home/uujjwal/libraries/opencv-nogpu/opencv-3.0.0/modules/videoio/src/cap_ffmpeg_impl.hpp:1556:83: error: use of enum 'AVCodecID' without previous declaration
make[2]: *** [modules/videoio/CMakeFiles/opencv_videoio.dir/src/cap_ffmpeg.cpp.o] …Run Code Online (Sandbox Code Playgroud) 请考虑以下几行
import theano.tensor as T
x = T.dscalar('x')
y = T.dscalar('y')
z = x+y
Run Code Online (Sandbox Code Playgroud)
然后,
In [15]: type(x)
Out[15]: theano.tensor.var.TensorVariable
Run Code Online (Sandbox Code Playgroud)
而,
In [16]: x.type
Out[16]: TensorType(float64, scalar)
Run Code Online (Sandbox Code Playgroud)
为什么type(x)和x.type提供两个不同的信息?他们传达了什么信息?
我也看到了提到Theano教程,
>>> type(x)
<class 'theano.tensor.basic.TensorVariable'>
>>> x.type
TensorType(float64, scalar)
Run Code Online (Sandbox Code Playgroud)
为什么类型(x)输出在我的情况下是不同的?这些是由版本特定的实现差异引起的,这是由这种差异所表示的吗?
我有两组元组a和b.
a = set([(1,'a'),(34,'b'), (82,'c')])
b = set([(8,'a'),(98,'c')])
Run Code Online (Sandbox Code Playgroud)
我想要一套c这样的
c = set([(34,'b')])
Run Code Online (Sandbox Code Playgroud)
在python中执行此操作的最有效方法是什么?
考虑以下两个代码片段(按顺序A和B):
struct abc {
int a {};
abc* next;
};
Run Code Online (Sandbox Code Playgroud)
和
struct abc {
int a {};
abc next;
};
Run Code Online (Sandbox Code Playgroud)
事实是:
1.代码片段A有效.
2.代码段B无效.
参数:
B无效,因为编译器在声明时无法确定片段B中abc的大小.(Stroustrup,C++编程语言,8.2.2)
我怀疑:
abc在编译片段A期间不是所需的大小?abc声明指针时是否需要大小abc?否则在编译期间,编译器将如何知道取消引用abc*?