Wu *_*wei 3 c++ inline c++11 visual-studio-2013
我正在用C ++为新容器编写迭代器。当我调用begin()和end()函数(都很短)时,我希望编译器将其内联。但事实并非如此。我认为可能是因为迭代器作为临时对象返回,并且需要将其复制。我想也许我可以在c ++ 11中使用RValue引用,但是我对此并不熟悉。那么有没有办法使其内联?
代码是这样的(不完全相同,但是我认为如果此版本有效,我的代码也将有效)?
我正在使用VC ++ 2013 CTP,并且更改了编译选项,但是它也不起作用。
class Pointer
{
public:
Pointer(int* p) : p(p)
{
(*p)++;
}
Pointer(const Pointer& pointer) : p(pointer.p)
{
(*p)++;
}
Pointer& operator =(const Pointer& pointer)
{
(*p)--;
p = pointer.p;
(*p)++;
}
int* p;
~Pointer()
{
(*p)--;
}
static Pointer create(int& p)
{
return Pointer(&p);
}
static Pointer create2(int& p)
{
return create(p);
}
};
int main()
{
int p = 0;
Pointer pointer = Pointer::create2(p);
}
Run Code Online (Sandbox Code Playgroud)
您可以看到,这里的函数create和create2不是内联的,即使您确实很简单。
我知道这可能不会影响程序速度,但我只是想使其更好。
在几种情况下,Microsoft的编译器无法内联函数:
http://msdn.microsoft.com/zh-CN/library/a98sb923.aspx
在某些情况下,由于机械原因,编译器不会内联特定功能。例如,编译器不会内联:
一个函数,如果将导致SEH和C ++ EH混合。
当打开-GX / EHs / EHa时,某些带有复制构造对象的函数按值传递。
-GX / EHs / EHa打开时,函数按值返回不可展开的对象。
不使用-Og / Ox / O1 / O2进行编译时,具有内联汇编功能。
具有可变参数列表的函数。
具有try(C ++异常处理)语句的函数。
由于函数Pointer按值返回并且具有析构函数,因此无法进行内联。
除了更改Pointer类之外,没有任何其他事情可做。右值引用在这里无济于事。我只保留原代码,如果您需要在最终产品中获得更好的性能,请尝试使用另一个编译器。
RVO可能会在这里发生,但是并没有什么区别,因为复制的成本很小。