作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个计算缓冲区大小的 C++ 函数:
CalcBuffer(unsigned long long* bufferSize);
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;
}
关于c++-cli - C++\CLI - 如何将 UInt64^% 转换为 unsigned long long*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39191277/
我是一名优秀的程序员,十分优秀!