【发布时间】:2016-12-12 13:52:43
【问题描述】:
我正在尝试强制 Visual c++ 编译器内联特定函数。我知道inline 或__forceinline 只是一个建议。根据MSDN,如果编译器不能内联使用__forceinline关键字标记的函数,则会产生警告:
如果编译器无法内联使用 __forceinline 声明的函数, 它会生成 1 级警告。
但我没有收到这样的警告。当我调试我的应用程序时,我看到反汇编窗口中有一个call <inlined function address>,即我的函数没有内联。那么如何检查我的函数是否内联?这是否意味着如果没有生成警告,则函数被内联并且问题在其他地方?
这是我的功能:
__forceinline SecByteBlock aes_generate_iv(size_t blockSize)
{
const int seedSize = 32;
SecByteBlock rngSeed(seedSize);
OS_GenerateRandomBlock(false, rngSeed, rngSeed.size());
RandomPool rngp;
rngp.IncorporateEntropy(rngSeed, rngSeed.size());
SecByteBlock aesIV(blockSize);
rngp.GenerateBlock(aesIV, aesIV.size());
return aesIV;
}
这是VC++不能内联函数的情况(来自MSDN):
- 函数或其调用者使用 /Ob0(调试构建的默认选项)编译。
- 函数和调用者使用不同类型的异常处理(一种是 C++ 异常处理,另一种是结构化异常处理)。
- 该函数有一个变量参数列表。
- 该函数使用内联汇编,除非使用 /Og、/Ox、/O1 或 /O2 编译。
- 该函数是递归的,不伴随#pragma inline_recursion(on)。使用 pragma,递归函数被内联到 16 个调用的默认深度。要减少内联深度,请使用 inline_depth pragma。
- 函数是虚拟的,被虚拟调用。可以内联对虚拟函数的直接调用。
- 程序获取函数的地址并通过指向函数的指针进行调用。可以内联直接调用已获取地址的函数。
- 该函数还标有裸 __declspec 修饰符。
【问题讨论】:
-
可能是警告默认关闭而您没有启用它?
-
@sharptooth,不,警告级别 3 已打开,并且将警告视为错误已打开。刚刚检查过。
-
无论您拥有哪种警告级别,某些警告默认为“关闭”。
-
@Bo Persson,我正在使用 /Ob2 选项进行编译。也尝试使用 /Ob1 - 结果相同
-
@sharptooth,如何启用此特定警告?
标签: c++ visual-c++ inline