我有一个用于 Mersenne twister 随机数生成器的简单包装器。目的是将生成器返回的数字(介于 0 和 1 之间)缩放到参数定义的限制(开始和结束)之间。
所以我的功能是
inline float xlRandomFloat(float begin, float end) {return (begin+((end-begin)*genrand_real2()));}
我不认为 genrand_real2() 函数的实现很重要,但如果我错了,可以找到它 here
问题是函数不返回翻译结果。缩放(乘以(begin-end)似乎工作正常,但似乎没有返回 begin 的加法。
因此,如果我调用 xlRandomFloat(5,10) - 我得到的值介于 0 和 5 之间。
如果我使用 GDB 进行调试,并使用打印功能,那么它会显示正确的结果。 所以我试着把事情分成几行,看看会发生什么
inline float xlRandomFloat(float begin, float end) {
float ret;
ret=(((end-begin)*genrand_real2()));
ret+=begin;
return ret;};
调试时,它从第一行直接跳转到 genrand_real2() 函数,并完全跳过其他所有内容。这真的很令人困惑,所以我认为这可能与内联有关。 我将文件从这个 .hpp 文件移动到 .cpp 并删除了 inline 关键字,一切正常。
但是为什么会出现这种行为,我该如何内联这个函数呢?另外,我不确定这是否相关,但通常当我更改源代码时,我的 Make 编译会说没有什么可做的。这是不寻常的,因为通常我希望 make 接受源中的更改并相应地重建。
任何想法。
谢谢
珍娜
最佳答案
好的,这里有几件事在起作用。
首先,关于调试,您描述了我认为或多或少预期的行为,因为当您内联一个函数时,没有生成代码来处理函数的原始问题。所以,第一个声明是
ret=(((end-begin)*genrand_real2()));
第一步是调用 genrand_real2()
。如果 genrand_real2(
) 也是内联的,那么您会在其中的第一条语句处结束,没有停下来喘口气。
其次,确保您确实在运行您认为的代码。尝试从一个干净的目录制作——一些 C++ 编译器制作预编译的片段,它们会保留这些片段以加快编译速度。确保您的内联定义已从头文件中完全删除或注释掉。米
第三,制作一个带有内联的非常简单的程序,并确保它的行为符合您的预期。
关于c++ - 来自随机数生成器包装器 (C++) 的令人困惑的内联行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/771012/