Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ VS2015中发布x64配置时的不同结果_C++_Optimization_Eigen - Fatal编程技术网

C++ VS2015中发布x64配置时的不同结果

C++ VS2015中发布x64配置时的不同结果,c++,optimization,eigen,C++,Optimization,Eigen,我正在使用VS2015社区实现一个光线跟踪程序。程序使用元素类型Eigen::Vector3f填充屏幕大小的颜色缓冲区(width*height),然后将缓冲区内容保存到ppm文件中 基本循环(注意外循环末尾的输出部分): 使用Vec3f=Eigen::Vector3f; Vec3f*buffer=新的Vec3f[w*h]; //对于每个像素 for(int y=0;y

我正在使用VS2015社区实现一个光线跟踪程序。程序使用元素类型
Eigen::Vector3f
填充屏幕大小的颜色缓冲区(
width*height
),然后将缓冲区内容保存到ppm文件中

基本循环(注意外循环末尾的输出部分):

使用Vec3f=Eigen::Vector3f;
Vec3f*buffer=新的Vec3f[w*h];
//对于每个像素
for(int y=0;y//std::cout在检查Ideone上的代码之后,问题似乎如下所示。在
场景
类中,
intersect
方法返回一个
布尔常量&
。返回的引用是一个局部变量。如果检查错误/警告日志,您会看到:

警告2警告C4172:局部变量或临时变量的返回地址***.cpp 129 1


将返回类型更改为
bool
可以纠正此问题,其输出与32位版本类似。

在Ideone上查看代码后,问题似乎如下所示。在
场景
类中,
intersect
方法返回一个
bool常量&
。返回的引用是本地的变量。如果检查错误/警告日志,您会看到:

警告2警告C4172:局部变量或临时变量的返回地址***.cpp 129 1


将返回类型更改为
bool
可以纠正问题,并且输出与32位版本类似。

您能否进一步充实您的示例?即,您对
r
的计算。如果无法再现您的输出,您得到的任何和所有答案都将是猜测。即使您说您不是寻找这个问题的解决方案,但不是一般的“经验”,这类问题通常被认为是离题(太宽泛)。但是如果显示了一个特定的问题,您可能会得到更全面的答案。@AviGinsburg
r
的计算太复杂了,因此我在问题的末尾附加了完整的代码链接。“太复杂了”是一个借口,这不是很有帮助。减少计算量,直到得到仍然显示该行为的最小版本。如果剥离代码改变了结果,您知道在哪里继续调查。无论如何,关于这方面的问题应该是独立的。如果您用一个简单的操作替换
r
的计算,例如简单的作业?你能用替换项重现问题吗?@IInspectable好的,我会按照你的建议减少它,谢谢。你能把你的例子再充实一点吗?也就是说,你对
r
的计算。如果不能重现你的输出,你得到的任何和所有答案都将是猜测。即使你假设你不是在寻找这个问题的解决方案,而是一般的“经验”,这类问题通常被认为是离题的(过于宽泛)。但是如果显示了一个特定的问题,您可能会得到更全面的答案。@AviGinsburg
r
的计算太复杂了,因此我在问题的末尾附加了完整的代码链接。“太复杂了”是一个借口,这不是很有帮助。减少计算量,直到得到仍然显示该行为的最小版本。如果剥离代码改变了结果,您知道在哪里继续调查。无论如何,关于这方面的问题应该是独立的。如果您用一个简单的操作替换
r
的计算,例如简单的作业?你能用替换品重现问题吗?@IInspectable好的,我会按照你的建议减少它,谢谢。这正是为什么需要an的原因,因为问题的根源不在原来的帖子中。打得好。我不明白为什么OP选择返回一个
常量bool&
。也许t嘿,最近读了,然后又倒过来了。@AviGinsburg我犯了两个错误:1)没有检查警告信息;2)没有仔细检查代码。对此感到抱歉。这个错误归因于“未初始化的局部变量”,我想真正的问题是为什么它看起来“正确”工作在32位版本中,我真的帮不了你。x86和x64之间的参数传递完全不同(堆栈与寄存器与寄存器)。不同的行为比相同或相似的行为更有可能。如果你真的需要知道,你必须查看生成的目标代码。这正是为什么需要an的原因,因为问题的根源不在原始帖子中。打得好。我不明白OP为什么选择返回一个
常量&
。也许ey最近读了,然后又把它全部倒过来。@AviGinsburg我犯了两个错误:1)没有检查警告信息;2)没有仔细检查代码。对此表示抱歉。这个错误归因于“未初始化的局部变量”,我想真正的问题是为什么它看起来“正确”工作在32位版本中。我真的帮不了你。x86和x64之间的参数传递完全不同(堆栈与寄存器与寄存器)。不同的行为比相同或类似的行为更有可能。如果你真的需要知道,你必须查看生成的目标代码。
using Vec3f = Eigen::Vector3f;

Vec3f * buffer = new Vec3f[w * h];

// for each pixel
for (int y = 0; y < h; y++) for (int x = 0; x < w; x++) 
{
    int const i = (h - y - 1) * w + x;
    buffer[i] = Vec3f::Zero();

    // 2x2 subpixel 
    for (int sy = 0; sy < 2; sy++) for (int sx = 0; sx < 2; sx++)
    {
        Vec3f r = Vec3f::Zero();

        // sampling
        for (int s = 0; s < samps; s++) 
        {
            // do some computation and accumulation to r
            // r = ...
        }
        buffer[i] = buffer[i] + r;
    }
    buffer[i] = buffer[i] * 0.25f;

    // debug with an output section
    //if (x % 16 == 0 && y % 16 == 0)
    //  std::cout << buffer[i] << std::endl;

}