草庐IT

c++ - 为什么 GCC 对 C++ <cmath> 比 C <math.h> 更有效地实现 isnan()?

这是我的代码:intf(doublex){returnisnan(x);}如果我#include我得到了这个程序集:xorl%eax,%eaxucomisd%xmm0,%xmm0setp%al这相当聪明:ucomisd如果x与自身的比较是无序的,则设置奇偶校验标志,这意味着x是NAN。那么setp将奇偶校验标志复制到结果中(只有一个字节,因此%eax的初始清除)。但是如果我#include我得到了这个程序集:jmp__isnan现在代码不是内联的,__isnan功能肯定是没有快的ucomisd指令,所以我们已经引起了无益的跳跃。如果我将代码编译为C,我会得到同样的结果。现在,如果我更改

c++ - 对于不遵循 libNAME.so 命名约定的库,如何在没有 -l 或硬编码路径的情况下使用 GCC 链接?

我有一个共享库,我希望使用GCC链接可执行文件。共享库的名称不是libNAME.so形式的非标准名称,因此我不能使用通常的-l选项。(它恰好也是一个Python扩展,因此没有“lib”前缀。)我可以将库文件的路径直接传递给链接命令行,但这会导致库路径被硬编码到可执行文件中。例如:g++-obuild/bin/myappbuild/bin/_mylib.so有没有办法链接到这个库而不会导致路径被硬编码到可执行文件中? 最佳答案 有一个“:”前缀可以让你给你的库赋予不同的名字。如果你使用g++-obuild/bin/myapp-l:_m

c++ - 为什么 typeid.name() 使用 GCC 返回奇怪的字符以及如何使它打印未损坏的名称?

当我运行这个main.cpp时怎么会:#include#includeusingnamespacestd;structBlah{};intmain(){cout通过使用GCC版本4.4.4编译它:g++main.cpp我明白了:4Blah在VisualC++2008上,我会得到:structBlah有没有办法让它只打印Blah或structBlah? 最佳答案 name的返回是实现定义的:甚至不需要实现为不同类型返回不同的字符串。你从g++得到的是decoratedname,您可以使用c++filt命令或__cxa_demangle

c++ - GCC 和 MS 编译器的模板实例化细节

谁能提供模板实例化的比较或具体细节在GCC和MS编译器的编译和/或链接时处理?这个过程有什么不同吗在静态库、共享库和可执行文件的上下文中?我找到了thisdoc关于GCC如何处理它,但我不确定信息是否仍然是指事物的当前状态。我应该使用标志吗他们在编译我的库时建议在那里,例如-fno-implicit-templates?我所知道的(可能不一定正确)是:模板在实际使用时会被实例化模板将作为显式实例化的结果进行实例化重复实例化通常通过折叠重复实例化或将实例化延迟到链接时间来处理 最佳答案 实例化点templateswillbeinsta

c++ - 为什么 GCC 不优化 C++ 中空指针的删除?

考虑一个简单的程序:intmain(){int*ptr=nullptr;deleteptr;}使用GCC(7.2),在生成的程序中有一个关于operatordelete的call指令。使用Clang和Intel编译器,没有这样的指令,空指针删除被完全优化(-O2在所有情况下)。你可以在这里测试:https://godbolt.org/g/JmdoJi。我想知道这种优化是否可以通过GCC以某种方式打开?(我更广泛的动机源于自定义swap与std::swap可移动类型的问题,其中删除空指针可能代表第二种情况下的性能损失;请参阅https://stackoverflow.com/a/4568

c++ - 限制关键字是否在 gcc/g++ 中提供了显着的好处?

有没有人见过任何关于在gcc/g++中使用C/C++restrict关键字是否在现实中(而不仅仅是在理论上)显着提高性能的数字/分析?我已经阅读了各种推荐/贬低其使用的文章,但我没有遇到任何实际证明任何一方论点的实数。编辑我知道restrict不是C++的正式组成部分,但它受到一些编译器的支持,我读过ChristerEricson的一篇论文强烈推荐使用它。 最佳答案 restrict关键字有所不同。在某些情况下(图像处理),我看到了2倍甚至更多的改进。大多数时候,差异并没有那么大。大约10%。这里有一个小例子来说明差异。我写了一个非

c++ - 无论代码如何,MinGW .exe 都需要一些 gcc dll?

使用MinGW编译时,我必须在运行exe之前从MinGWbin目录中复制某些dll文件(即使使用“-static”和/或“-static-libstdc++”。)我该如何改变呢?是否有我必须使用的特殊版本的MinGW?最终,我希望能够在目录中除了exe之外什么都没有运行程序(并且没有设置windows环境变量。)这些文件是:libstdc++-6.dlllibgcc_s_seh-1.dlllibwinpthread-1.dll这是我休闲的步骤的完整列表:打开代码::block选择“文件->新建->项目->控制台”填写项目“HelloWorld”的项目设置右键Project->Build

c++ - 如何在 GCC 搜索路径中包含头文件?

我在示例文件中有以下代码:#include"SkCanvas.h"#include"SkDevice.h"#include"SkGLCanvas.h"#include"SkGraphics.h"#include"SkImageEncoder.h"#include"SkPaint.h"#include"SkPicture.h"#include"SkStream.h"#include"SkWindow.h"但是,此代码位于/home/me/development/skia内的多个文件夹中(其中包括core/animator/images/ports/svg/等等。)如何让GCC识别这条路径

c++ - GCC 4.7 从初始化器列表初始化 unique_ptrs 容器失败

我正在尝试初始化std::vector>以相当于BjarneStroustrup'sC++11FAQ中的示例的方式:usingnamespacestd;vector>vs{newstring{"Doug"},newstring{"Adams"}};//failsunique_ptrps{newstring{"42"}};//OK我看不出这种语法为什么会失败。这种初始化容器的方式有问题吗?编译器错误信息很大;我找到的相关部分如下:/usr/lib/gcc-snapshot/lib/gcc/i686-linux-gnu/4.7.0/../../../../include/c++/4.7.0

c++ - 编译一个相当简单的c++ 11程序时gcc和clang之间的不同结果

我试图了解gcc与clang在这个简单的C++11程序的输出中暴露的不同行为是否是由于clang中的错误(Xcode5.0.2,OSX10.8.5)。代码如下:#includeintmain(){intmatrix[][3]{{1,2,3},{4,5,6},{7,8,9}};autodyn_matrix=newint[3][3]{{1,2,3},{4,5,6},{7,8,9}};std::cout如图所示,我正在尝试使用统一初始化来初始化大小为3x3的匿名(或命名)多维数组。从MacPorts使用gcc4.7编译时,会获得预期的输出:$g++-mp-4.7-std=c++11dyn_m