gpt4 book ai didi

c++-cli - C++/CLI 二维数组分配失败

转载 作者:行者123 更新时间:2023-12-02 00:08:38 28 4
gpt4 key购买 nike

下面的代码打印 0 和 3。这是代码生成错误吗?我在 .NET 4.0 下使用 Visual Studio 2012 Update 3 RC 运行它

#include "stdafx.h"
using namespace System;
int main(array<System::String ^> ^args)
{
unsigned long long d1 = 5, d2 = 3;
auto arr = gcnew array<Object^, 2>(d1, d2);
Console::WriteLine(arr->GetLength(0));
Console::WriteLine(arr->GetLength(1));
return 0;
}

更新:我已在 https://connect.microsoft.com/VisualStudio/feedback/details/788830/c-cli-2-dimensional-array-allocation-with-unsigned-long-long-size-argument-generates-invalid-code 提交了连接错误报告

最佳答案

是的,那肯定像 bug 一样嘎嘎叫。编译器为此代码生成错误的 IL,它似乎对必须将 unsigned long long 转换为 int 感到非常困惑。您可以通过运行 ildasm.exe 查看错误的 IL,相关代码段为:

  IL_000a:  ldloc.3
IL_000b: conv.i4
IL_000c: ldloc.2
IL_000d: conv.i4
IL_000e: conv.i8 // <=== here!
IL_000f: newobj instance void object[0...,0...]::.ctor(int32,
int32)

地址 IL_000e 处的指令是麻烦制造者,它将 IL_000d 产生的 int 转换回 8 位整数。然后,这会弄乱传递给数组构造函数的参数。奇怪的是,IL 验证器也没有捕捉到它。

这不是 Update 3 错误,它在 VS2008 中也以完全相同的方式失败,因此这肯定是一个老问题。对于unsigned long long到System::Int32的强制转换也是高度特异的,long long不会出错。这可能是长期以来未被发现的可能原因。请注意,编译器会针对此代码发出警告,提示它必须将 unsigned long long 截断为 int。因此,通过在打开/WX 的情况下进行编译来解决这个问题。

错误和警告的解决方法是自己显式转换变量:

auto arr = gcnew array<Object^, 2>((int)d1, (int)d2);

您可以在 connect.microsoft.com 上提交此问题。如果您不想花时间做这件事,请告诉我,我会处理的。

关于c++-cli - C++/CLI 二维数组分配失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16787865/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com