假设我们有一个结构体数组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 }\nRun Code Online (Sandbox Code Playgroud)\n\n所以现在我将在我的代码中访问此Entry[0].next
\n\nclass Test\n {\n Entry[] entries = new Entry[2];\n\n void AccessElement()\n {\n int n = entries[0].next; \n }\n }\nRun 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字节)。
2).想法2
\n\nEntry entry = Copy(&entries[0],8);\nint n = entry.next;\nRun Code Online (Sandbox Code Playgroud)\n\n将条目对象的第一个元素(偏移量 0)复制到当前堆栈中,并返回当前堆栈对象条目的下一个成员
\n\n这两个想法是我对CLR访问结构体数组中元素成员的想法,这和我在某些情况下是否使用struct有关,毕竟大量数据mov有一些开销。所以有人可以告诉我吗CLR 如何访问结构体数组中元素成员的真实模式?调试和发布之间有什么区别吗?
\n\n …PostgreSQL使用MVCC技术进行数据库并发控制,为每次写入创建一个项目的新版本,然后通过可见性规则访问该版本。问题是btree索引如何实现多版本控制?当添加新的btree节点和树时被分裂后,原有的btree结构会发生改变。这时候PGSQL是怎么处理的?有人能告诉我吗?