草庐IT

c++ - 理解c++中模板的问题

在使用模板函数之前,模板代码不会被编译。但是编译后的代码保存在哪里,是保存在最初使用模板函数的目标文件中吗?例如,main.cpp是从文件test.h中调用一个模板函数,编译器生成一个目标文件main.o,模板函数在main.o文件里面吗?因为模板代码不是内联的,是吗? 最佳答案 它完全依赖于编译器实现。大多数编译器会围绕、内联或在类似cpp的文件中生成代码,然后使用它们进行编译。有时,通过优化设置,一些编译器甚至会重用相同的代码,而不是为每个cpp重新创建它。因此您必须查看编译器的文档以获取更多详细信息。

c++ - std::functions 是否由 C++11 编译器内联?

我正在使用C++11开发一个小型数学优化框架,我想知道用户提供特定领域逻辑的最佳方式是什么。我可以强制她用框架可以调用的钩子(Hook)方法定义类,但我想保持精简并尽可能利用新的C++11工具。所以我正在考虑接受可能从lambda表达式实例化的std::function对象作为参数,并在需要时调用它们。我唯一想知道的是编译器(在我的例子中是gcc,但我也想了解Xcode和VisualC++)是否能够获取std::function对象并内联函数定义,以便它们与其余代码一起优化。PS:从评论来看,我的问题的第一次修改对大多数用户来说似乎是晦涩难懂的,这可能是我使用了不正确的语言的错。所以我

c++ - gdb,多个位置的断点

我在其中一个.h文件中设置了一个断点,该文件实现了一个小方法,(gdb)breakSmallVector.h:141这是我从gdb得到的:Breakpoint5at0x416312:SmallVector.h:141.(38locations)为什么断点设置在38个位置而不是一个位置?我对调试和C++都不是新手,但不幸的是,我从来没有像现在(编译器)那样处理过任何复杂的东西。所以我以前从未遇到过这样的事情。感谢任何帮助。 最佳答案 有几种方法可以实现这一点。如您所见,一种主要方式是内联函数。一些编译器(如gcc)将发出有关它已完成的

c++ - 内联 lambda 是否会遭受与函数指针间接寻址相同的延迟

//approach1templatevoidf1(Tt,inta,intb){t(a,b);}//approach2voidf2(void(*g)(int,int),inta,intb){g(a,b);}voidg(inta,intb){//dosomething}intmain(){f1([](inta,intb){//dosomething},1,2);f2(&g,1,2);}我的问题是,f1和f2是否遭受相同的间接寻址延迟以获取要执行的函数的地址(假定lambda实现为函数对象)?如果lambda不是内联的怎么办?注意:我将函数f1声明为模板,以便将参数lambda类型的推导留

c++ - 为什么有内联函数声明而不是内联函数调用?

C++(和其他各种语言)支持内联函数。如果我想让一个函数内联,我必须在声明中使用inline关键字。对我来说,这个接缝很不直观:为什么我不能在调用函数时只使用inline?示例:voidfoo(){...}inlinefoo();代替inlinevoidfoo(...){...}foo();这将允许我仅在特定位置内联该函数,而无需复制该函数。此外,每个函数都可以内联,这将使机制更加灵活。有没有不支持的原因? 最佳答案 前言:内联函数即内联即内联扩展是一种优化,其中函数调用被重复的指令集替换.声明一个内联函数就是向链接器声明该函数的处

使用模板与内联的 C++ 元编程

是否值得编写如下代码来复制数组元素:#includeusingnamespacestd;templatestructRepeat{staticvoidcopy(int*x,int*y){x[START+N-1]=y[START+N-1];Repeat::copy(x,y);}};templatestructRepeat{staticvoidcopy(int*x,int*y){x[START]=y[START];}};intmain(){inta[10];intb[10];//initializefor(inti=0;i::copy(a,b);//showfor(inti=0;i还是使用

c++ - 使用静态库时未解析的外部符号 "_hypot"

我正在尝试重新编译链接Ruby库的旧游戏,但我不断收到此错误:ruby18-mt-static-release.lib(math.obj):errorLNK2001:unresolvedexternalsymbol_hypot有没有不需要我找到这个库的源代码并重新构建它的解决方法?我正在使用VisualStudio2010和最新的DirectXSDK。 最佳答案 我遇到了类似的问题。显然hypot曾经是一个可链接的函数,但现在(我有VS2010)是一个调用_hypot的内联函数。在math.h中,这是完成此操作的唯一函数。我没有我正

c++ - 没有必要导出只有虚函数/内联函数的类?

在Win32上的C++中:假设我有一个带有声明类的头文件的DLL。DLL导出一些获取指向该类实例的指针/引用的方法,例如工厂函数。如果一个人只打算在其实例上调用虚函数或内联函数,那么我认为没有必要使用__declspec将该类标记为导出类是否正确?反之,调用非虚成员函数是否需要导出类声明? 最佳答案 AmIcorrectinbelievingthatitisnotnecessarytomarkthatclassasexportedusing__declspecifoneisonlygoingtocallvirtualorinline

c++ - 'private'访问修饰符是否给了编译器更大的优化空间?

它是否允许编译器内联它,知道只有同一个类中的函数才能访问它?还是只是为了程序员的方便? 最佳答案 编译器可以(但不是必须)按照您的建议进行优化,但这不是要点。访问修饰符的目的是在编译时捕获某些类(没有双关语)的编程错误。私有(private)函数是这样的函数,如果有人从类外部调用它们,那将是一个错误,您希望尽早了解它。(任何时候你问“编译器是否可以根据可用的信息进行优化”这个问题,答案都是“是的,除非标准中有特定的规则说不允许”(例如volatile的规则,其全部目的是抑制优化)。然而,编译器不一定打扰根据任何给定的信息进行优化。毕

c++ - .h 文件上非常简单的函数 C++ 的链接错误

我创建了两个函数来将32/64位指针“转换”为double。该代码在单独使用时有效(只有.h和一个.cpp包括它)但是当在其他地方使用.h时(复制到项目目录然后包含)它会为.h上的所有函数抛出“已定义”错误。链接时的h文件。.h文件的源代码如下:#pragmaonce#ifndef__FLOATCAST_H#define__FLOATCAST_H//Aquickanddirtywayofcastingpointersintodoublesandback//ShouldworkwithBOTH64bitand32bitpointersunionptr_u{doubled;void*p;}