小编Zen*_*eng的帖子

如何在 C# 中访问结构体数组中的元素成员

假设我们有一个结构体数组Entry[2],它在内存中的布局如下所示:[hashcode(4byte),next(4byte),hashcode(4byte),next(4byte)]

\n\n
    [StructLayout(LayoutKind.Explicit, Size = 8, Pack = 1)]\n    struct Entry\n    {\n        [FieldOffset(0)]\n        public int hashCode;\n        [FieldOffset(4)]\n        public int next;\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以现在我将在我的代码中访问此Entry[0].next

\n\n
class Test\n    {\n        Entry[] entries = new Entry[2];\n\n        void AccessElement()\n        {\n            int n = entries[0].next; \n        }\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以在AccessElement方法中,我只有一行代码,即:entries[0].next,我想知道CLR如何帮助我们访问这个元素。
\n我现在有两个想法,我将给你伪代码。
\n 1).idea 1
\n int n = (&entries+0)->next
\n 获取entries对象的地址,获取第一个元素(偏移量0),并访问下一个成员的值(相对于元素基地址的4字节)。

\n\n

2).想法2

\n\n
Entry entry = Copy(&entries[0],8);\nint n = entry.next;\n
Run Code Online (Sandbox Code Playgroud)\n\n

将条目对象的第一个元素(偏移量 0)复制到当前堆栈中,并返回当前堆栈对象条目的下一个成员

\n\n

这两个想法是我对CLR访问结构体数组中元素成员的想法,这和我在某些情况下是否使用struct有关,毕竟大量数据mov有一些开销。所以有人可以告诉我吗CLR 如何访问结构体数组中元素成员的真实模式?调试和发布之间有什么区别吗?

\n\n …

c#

7
推荐指数
0
解决办法
361
查看次数

PostgreSQL的btree索引是如何实现多版本并发控制的?

PostgreSQL使用MVCC技术进行数据库并发控制,为每次写入创建一个项目的新版本,然后通过可见性规则访问该版本。问题是btree索引如何实现多版本控制?当添加新的btree节点和树时被分裂后,原有的btree结构会发生改变。这时候PGSQL是怎么处理的?有人能告诉我吗?

postgresql b-tree

1
推荐指数
1
解决办法
419
查看次数

标签 统计

b-tree ×1

c# ×1

postgresql ×1