草庐IT

c++ - 可以使用内联命名空间来保持共享库的向后兼容性吗?

C++内联命名空间的基本原理是源代码和二进制兼容性(请参阅HerbSutter的论文,链接在N2535中),但我无法找到保持现有二进制兼容性的好例子引入内联命名空间时的库,或者如果可能的话。(有关更多信息和源兼容性示例,请参阅thisquestion)(解决一个相关问题,使用inlinenamespace引入不兼容,参见thisquestion)如果这是我们当前的库(例如mylib.dll),它与客户共享并且需要稳定:structModelA{/*(...)lotsofstuff*/};structModelB{/*(...)lotsofstuff*/};我们能否在不破坏客户端的情况下

c++ - 如何在 Clang 中启用内联函数的编译?

我正在使用Clang作为库来生成一些LLVMIR模块。这是模块的源代码:inlineintgetSevenInline(){return7;}intgetSeven(){returngetSevenInline();}我希望LLVMIR模块包含一个函数getSeven,它返回7。这是我的程序生成的LLVMIR:;ModuleID='./test.cpp'source_filename="./test.cpp"targetdatalayout="e-m:o-i64:64-f80:128-n8:16:32:64-S128"targettriple="x86_64-apple-macosx1

c++ - 使用内联函数在 C++ 中更安全地删除指针

来自thisquestion,我是这样实现的Utils.h:templatevoidSafeDeleteWithoutClass(T*&pVal){std::coutvoidSafeDeleteArrayWithoutClass(T*&pVal){std::coutmain.cpp#include"Utils.h"structFoo{Foo(){std::cout(pObj2);return0;}效果很好。但是我团队中的一些人说它并不真的比宏好。我不知道是否有任何例子可以证明这种方式比宏更好。你能给我一个提示吗? 最佳答案 它并不比

c++ - 内联函数是否使对编译后的二进制文件进行逆向工程变得更加困难?

所以基本上,除了可能的性能影响之外,内联函数是否对从编译和链接的二进制文件中逆向工程程序的难度有相当大的影响?我的意思是,它应该是,因为1)黑客只是看到了更多的机器指令,而不是很好理解的“调用XXXXX”,他可能已经发现可以做某事。2)内联为编译器优化代码提供了更多的可能性,那更令人困惑,对吧?此外,考虑到inline关键字只是对编译器的一个建议,这到底能起到多大的作用?我们应该打扰吗?我的意思是,当然他们最终会破解它,但如果通过如此简单的措施我们可以让破解者的生活更艰难,为什么不呢? 最佳答案 是否选择内联方法不应基于逆向工程的难

c++ - 我如何使用 gcc 的内联报告 (-Winline)

在我的项目中启用-Winline会产生大量我不太理解的输出。有谁知道如何使用此输出找出我的特定函数未内联的原因? 最佳答案 好吧,根据我的gcc手册页...Thecompilerusesavarietyofheuristicstodeterminewhetherornottoinlineafunction.Forexample,thecompilertakesintoaccountthesizeofthefunctionbeinginlinedandtheamountofinliningthathasalreadybeendonei

c++ - 编译器内联什么调用?

您如何知道编译器会内联或不会内联什么?有时我被告知一些小的优化是没有意义的,因为编译器会内联某些调用或计算,其他时候似乎推荐类似的优化。让我们知道何时需要或不需要优化这些东西的规则是什么? 最佳答案 查看某个内容是否内联的唯一可靠方法是查看程序集。是否内联某些内容完全取决于编译器-因为编译器最终决定是否内联某些内容。撇开过早的优化:如果它真的很重要(或者如果您只是好奇),您可以使用特定于编译器的编译指示强制内联/不内联函数,然后适本地分析以查看是否你可以做出比编译器更好的决定。尽管如此,在某些情况下您可以确定无法内联函数:在编译时无

C++ 自动实现的函数和 ODR

详细解释如下,问题在底部。我的问题具体指的是当前的C++标准草案(也是当前的“主要”标准)here.更具体地说,关于成员函数和ODR,第3.2节第6点(第35页)指出D的每个定义应包含相同的标记序列。最近在项目中添加新的数据分析时遇到了如下问题。我正在写一个文件,A.cpp。我创建了一个小的虚拟结构来保存一些数据。在此示例中,我将其称为Data。namespaceExample{structData{//etc};//UseData};但是在另一个文件B.cpp中,Example命名空间中已经有一个名为Data的结构。编译器为这两个类生成Data::~Data();,然后调用它们各自成

c++ - 强制内联递归函数

考虑定义阶乘函数的经典方法:#include__attribute__((always_inline))inlineintfactorial(intn){if(n==1){return1;}else{returnn*factorial(n-1);}}intmain(){printf("value%d",factorial(7/*guaranteedtonotoverflowint*/));}我正在强制我的编译器(gcc)内联阶乘函数。那应该会导致问题。gcc无误地忽略了我的强制内联。这是预期的吗? 最佳答案 来自GCC的文档:GCC

c++ - 带有静态变量的静态内联函数

看完staticvariablesinaninlinedfunction,我写了这个测试程序:主要.cpp:#include#include"a.h"#include"f.h"voidg();intmain(){std::cout嗯:structA{A(){std::coutf.h:(由于未命名的命名空间,每个编译单元的本地单例)namespace{inlineA&f(){staticAx;returnx;}}g.cpp:#include#include"a.h"#include"f.h"voidg(){std::cout问题是我用不同的编译器没有得到相同的结果:g++4.8.2:好的

c++ - 使用 GCC 导出 C++ 类的符号

我正在使用dlopen合并动态加载库及其宿主的符号,在宿主中我有一个类:classFoo{public:Foo(){/*...*/}voidbar(){/*...*/}};intmain(){//Foofoo;return0;}我正在使用g++-Wl,--export-dynamic-otesttest.cpp编译它并使用nm-gtest检查符号。我希望符号_ZN3FooC1Ev和_ZN3FooC2Ev存在于可执行文件中,因为动态库需要它们,但除非我通过取消注释上面的行来使用它们,否则它们不会出现.我相信它正在被优化掉,因为GCC认为不需要它。如何强制将Foo的构造函数和方法包含在主机