gpt4 book ai didi

c# - 获取指向自身内部结构的指针(不安全上下文)

转载 作者:太空狗 更新时间:2023-10-29 22:14:36 25 4
gpt4 key购买 nike

长话短说,我将提供一个可能有用的简单示例:

public struct Vector3f {
public float x;
public float y;
public float z;

public unsafe float this[int index] {
get {
// Get "p" somehow, so that it points to "this"...

return p[index];
}

set {
// Get "p" somehow, so that it points to "this"...

p[index] = value;
}
}
}

我猜你明白我的意思了:

var v = new Vector3f();

Assert(v.x == v[0]);

编辑 1:

对于那些还在问的人:)

Assert(v.y == v[1]);
Assert(v.z == v[2]);

编辑 2:

fixed 会在这里产生多余的开销吗?或者也许这个结构已经固定,因此 fixed 在这里没有效果,只需要满足编译器? Possible answer .

最佳答案

首先,我不会为此使用不安全的代码,除非我首先确定 (1) 带有开关的明显代码将是整个程序中最慢的代码,并且会导致严重的用户- 可观察到的减速,并且 (2) 使用不安全的代码可以解决性能问题。

其次,如果我要使用不安全的代码,对结构打包做出假设是非常危险的。允许 CLR 在选择如何打包结构方面有很大的自由度。 如果您打算做这种危险的事情,那么您应该使用 struct layout 属性来确保 float 正好在您需要的位置。

第三,是什么阻止了错误的调用者传递负索引或过大的索引?

第四:

Does fixed create redundant overhead here?

我不知道“冗余开销”是什么意思。 “固定”使抖动告诉垃圾收集器“不要移动这个东西,因为我需要对其进行指针运算”。您正在短期固定,这是理想的;长时间固定会使集合更容易变得困惑,因为固定存储无法移动。

第五:

Or maybe this struct is already fixed, and therefore fixed has no effect here and is only needed to satisfy the compiler?

也许吧!也许“this”所指的变量已经是固定变量了。 也许不是。编译器 应该如何知道结构的“this”是否是对固定存储的引用?我们必须假设最坏的情况,因此您需要修复它。

关于c# - 获取指向自身内部结构的指针(不安全上下文),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8757855/

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