草庐IT

c++ - C++ 中的内联 throw() 方法

我正在尝试定义一个非常简单的异常类。因为它太简单了,所以我只想将它保留在.h文件中,但编译器不喜欢throw()。代码:#include#includeclassPricingException:publicvirtualstd::exception{private:std::stringmsg;public:PricingException(std::stringmessage):msg(message){}constchar*what()constthrow(){returnmsg.c_str();}~PricingException()throw(){}};GCC给出以下错误:/

c++ - 我是否必须在函数实现中重复内联关键字

我总是尝试将实现保持在header之外,因此对于模板和内联函数,我通常会这样做//File.hinlineboolfoo()#include"File.hpp"//File.hppinlineboolfoo(){return1;}我的问题是,对于函数的实际实现重复inline关键字,C++规范有什么规定?(如本例所示)我真的不想这样做,因为它会因为很多函数而变得困惑,虽然我的编译器没有提示,但我想知道编译器是否仍然接受内联提示。有人知道吗? 最佳答案 我倾向于将inline放在尽可能远离接口(interface)的地方,因为它是一个

c++ - 优化函数调用

是否可以想象C++编译器会优化对仅设置类变量的类成员函数的函数调用?示例:classA{private:intfoo;public:voidbar(intfoo_in){foo=foo_in;}}如果我这样做Atest;A.bar(5);编译器可以优化它以直接访问成员并像这样设置它吗? 最佳答案 是的,这叫做内联。此外,c++专门设计用于在非常复杂的继承情况和模板中支持或使编译器更容易执行此类优化。有人会说,与其他语言相比,c++作为一种高级语言,这是非常独特的壮举。它的“高级”功能(我指的主要是通用编程-模板)在设计时就考虑到了这

C++ 字符串流内联

我想使用std::stringstream创建格式化字符串,但使用内联类所以我没有stringstream局部变量飞来飞去。我的意思是:#include#include#include#includeintmain(intargc,char*argv[]){std::stringtest=((std::ostringstream&)(std::ostringstream("")这在GCC中编译得很好,但是输出如下:"0x401d0a50.1abc"看来stringstream将第一个字符串视为指针并输出地址。后续operator的工作正常。我该如何解决这个问题?谢谢!

c++ - 内联函数(何时插入)?

内联函数只是对编译器的请求,编译器将内联函数的完整主体插入代码中使用该函数的每个位置。但是编译器如何决定是否应该插入它呢?它使用哪种算法/机制来决定?谢谢,纳文 最佳答案 一些共同点:编译器选项(调试构建通常不内联,大多数编译器都有选项来覆盖内联声明以尝试内联全部或不内联)合适的调用约定(例如可变参数函数通常不是内联的)适合内联:取决于函数的大小、函数的调用频率、通过内联获得的yield以及优化设置(速度与代码大小)。通常,小函数最有好处,但如果只调用一次大函数,则可能会被内联内联调用深度和递归设置第三个可能是您问题的核心,但这实际

c++ - 外部内联函数在所有翻译单元中必须具有相同的地址。这到底是如何实现的?

根据标准,外部内联函数在所有翻译单元中必须具有相同的地址。这是如何在编译器中实现的?我的意思是当我编译一些翻译单元时,我不知道其他TU会是什么样子。那么我怎样才能在所有地方使用相同的地址呢? 最佳答案 这取决于实现,但通常由链接器解决。每个编译的翻译单元将生成一个包含函数拷贝的目标文件,以某种方式标记,以便链接器知道它应该期望(并接受)拷贝。链接器将包含其中一个,丢弃其他,并解析对该函数的任何引用。 关于c++-外部内联函数在所有翻译单元中必须具有相同的地址。这到底是如何实现的?,我们在

c++ - 在 Visual C++ 中从内联程序集访问类成员

这是我的代码:voidGraph::PutPixel(DWORDx,DWORDy,DWORDc){__asm{MovEax,yMovEbx,_widthMulEbxAddEax,xShlEax,2//MultiplybyfourAddEax,_bufferMovEdi,EaxMovEax,cStosD}}其中_buffer和_width是Graph类成员:private:DWORD_width;DWORD*_buffer;它不起作用;我从两个变量中得到0值,但实际上它们还有一些其他值。我可以通过将类变量复制到局部变量并使用它们来修复它:voidGraph::PutPixel(DWORD

c++ - 使函数内联会影响它的链接吗?

如果我将函数设为内联,它是否会将其链接更改为内部链接?例如:我在两个文件中使用或调用内联函数:file1.cpp//functiondefinitioninlinevoidfoo(){}file2.cpp//functiondefinitioninlinevoidfoo(){}为什么我需要在每个文件中定义内联函数才能调用它?我得到一个内部链接?如果我使用staticinline会怎样? 最佳答案 IfImakeafunctioninlinedoesitchangeitslinkagetointernallinkage?不,将其内联并

c++ - 跨翻译单元和 gcc 4.6 自动内联函数

如果我不将函数f声明为内联。如下:嗯:Xf(Yy);A.cpp:Xf(Yy){...}然后在不同的翻译单元中:B.cpp:#include"A.h"Zg(Ww){......f(...)......}然后我用gcc4.6编译A.o和B.o这两个翻译单元,然后也通过gcc链接它们。(也许对两个步骤都使用-O3)gcc会考虑在链接时内联函数以提高性能吗?还是为时已晚?在一次代码审查中,有人建议我不应该将我的函数声明为内联,因为编译器比我更了解何时内联。我一直觉得除非函数在header中定义,否则编译器没有内联它的选项。(如果C模式、C++模式或gnu++0x模式的答案不同,请同时指出)

c++ - VS 2010 中返回值的编译器优化

使用完全优化的VS2010/Ox查看以下两个函数调用:staticstringtest1(conststring&input){returninput;}staticvoidtest2(conststring&input,string&output){output=input;}如果我使用后一个test2,那么函数总是被优化掉并且代码被内联。但是,除非我关闭异常,否则不会内联test1。有人知道为什么吗?此外,如果编译器使用返回值优化,我希望编译器能够在test1中像test2一样高效地工作,但它似乎没有这样做。这也是我的困惑。我想使用第一个函数签名的原因是我有该函数的两个可编译版本。