gpt4 book ai didi

c++-cli - C++\CLI - 如何将 UInt64^% 转换为 unsigned long long*

转载 作者:行者123 更新时间:2023-12-05 00:54:50 24 4
gpt4 key购买 nike

我有一个计算缓冲区大小的 C++ 函数:

CalcBuffer(unsigned long long* bufferSize);

我想稍后在我的 C# 代码中将此结果传递给不同的函数。
我的 C++\CLI 包装器看起来像这样:
CalcBufferWrapper([Out] UInt64^% bufferSize){
CalcBuffer(bufferSize);
}

但我收到此错误:

argument of type "System::UInt64 ^" is incompatible with parameter of type "unsigned long long *".



显然,我需要使用不同的类型,但是哪种类型呢?

最佳答案

UInt64^%并不意味着你认为它的作用。 ^ hat 只能用于引用类型,UInt64 是值类型。大约 99% 的情况下这样做是错误的,但 C++/CLI 编译器无论如何都会接受它并将其解释为“对 盒装 64 位无符号整数的引用”。装箱转换将值转换为对象,实现了著名的错觉,即值类型也从 System::Object 派生。

这当然与 unsigned long long* 不兼容。请检查您的代码以确保您不会意外地在其他地方不恰本地使用 ^ 帽子。这是一个剧烈的处理器周期下沉,使代码比它需要的慢一个数量级。

你必须停止使用这顶帽子。并处理您添加它的可能原因,即 UInt64 可能是托管对象的字段。在 native 代码运行时,垃圾收集器可能会移动它。那将是完全灾难性的( native 代码现在会破坏堆),因此编译器将不允许这样做。您必须提供无法移动的值的稳定副本:

void CalcBufferWrapper(UInt64% bufferSize) {
auto size = bufferSize; // Values on the stack don't move
CalcBuffer(&size);
bufferSize = size;
}

更好的是,根本不需要为包装器提供与包装函数完全相同的签名:
UInt64 CalcBufferWrapper() {
unsigned long long size;
CalcBuffer(&size);
return size;
}

这也应该是一个属性(property)的一些可能性。

关于c++-cli - C++\CLI - 如何将 UInt64^% 转换为 unsigned long long*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39191277/

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