随机数生成器包装器的令人困惑的内联行为(C ++)

时间:2009-04-21 04:15:29

标签: c++ c random inline

我有一个简单的Mersenne Twister随机数发生器包装器。目的是将生成器返回的数字(在0和1之间)缩放到参数定义的限制(开始和结束)之间。

所以我的功能是

inline float xlRandomFloat(float begin, float end) {return (begin+((end-begin)*genrand_real2()));}

我不相信genrand_real2()函数的实现很重要,但如果我错了,可以找到它here

问题是函数没有返回翻译结果。缩放(乘以(开始 - 结束)似乎正常工作,但似乎没有返回begin的添加。

因此,如果我调用xlRandomFloat(5,10) - 我得到0到5之间的值。

如果我使用GDB进行调试,并使用print函数,那么它会显示正确的结果。 所以我尝试将事物分成几行来看看会发生什么

inline float xlRandomFloat(float begin, float end) {
    float ret;
    ret=(((end-begin)*genrand_real2()));
    ret+=begin;
    return ret;};

调试时,它从第一行直接跳转到genrand_real2()函数,并完全跳过其他所有内容。这真的令人困惑,所以我认为它可能与内联有关。 我将文件从此.hpp文件移动到.cpp并删除了内联关键字,一切正常。

但是为什么会出现这种情况,我该如何内联此功能呢?另外,我不确定这是否相关,但是当我对源进行更改时,我的Make编译会说没有什么可做的。这是不寻常的,因为通常我希望make能够了解来源的变化并相应地重建。

任何想法。

由于

泽纳

2 个答案:

答案 0 :(得分:1)

您的代码非常好,编译方式肯定有问题。确保您的Makefile具有正确的依赖关系:源文件需要依赖于它们包含的头文件。跟踪这些依赖关系很少是手工完成的,通常只针对非常小的项目 - 它们通常由makedepend等工具生成。

要查看内联是否导致问题,只需使用GCC使用-O0(短划线资本 - 零)选项禁用所有优化。另外,请确保使用-g启用调试符号。

答案 1 :(得分:1)

好的,有几件事在这里工作。

首先,在调试时,你会描述我所认为的或多或少的预期行为,因为当你内联一个函数时,没有生成的代码可以解决函数的问题。所以,第一个声明是

ret=(((end-begin)*genrand_real2()));

,第一步就是致电genrand_real2()。如果genrand_real2(内联,那么你最终会在第一个语句中结束,没有停顿来喘口气。

其次,确保您真正运行您认为自己的代码。尝试从一个干净的目录制作 - 一些C ++编译器制作他们保留的预编译片段以加快编译速度。确保您的内联定义已从头文件中完全删除或注释掉。米

Thrd,使用内联制作一个非常简单的程序,并确保它的行为符合您的预期。