gpt4 book ai didi

c++ - 将结构和类写入磁盘

转载 作者:太空宇宙 更新时间:2023-11-04 15:10:21 25 4
gpt4 key购买 nike

以下函数将结构写入文件。

#define PAGESIZE  sizeof(BTPAGE)
#define HEADERSIZE 2L

int btwrite(short rrn, BTPAGE *page_ptr)
{
long addr;
addr = (long) rrn * (long) PAGESIZE + HEADERSIZE;
lseek(btfd, addr, 0);
return (write(btfd, page_ptr, PAGESIZE));
}

结构如下。

typedef struct {
short keycount; /* number of keys in page */
int key[MAXKEYS]; /* the actual keys */
int value[MAXKEYS]; /* the actual values */
short child[MAXKEYS+1]; /* ptrs to rrns of descendants */
} BTPAGE;

如果我将结构更改为一个类,会发生什么情况,它仍然可以正常工作吗?

如果我添加类函数,它占用的磁盘大小会增加吗?

最佳答案

这里有很多你需要学习的东西。

  • 首先,您将结构视为字节数组。由于 strict aliasing rule,这是严格未定义的行为.任何事情都可能发生。所以不要这样做。请改用适当的序列化(例如通过 boost )。是的,这很乏味。是的,这是必要的。
  • 即使您忽略未定义性,并选择依赖于某些特定的编译器实现(甚至在下一个编译器版本中可能会发生变化),仍然有理由不这样做。
    • 如果你在一台机器上保存一个文件,然后在另一台机器上加载它,你可能会得到垃圾,因为第二台机器使用不同的浮点表示,或者不同的endianness。 , 或者有不同的 alignment rules
    • 如果您的结构包含任何指针,则很可能逐字保存它们然后将它们加载回会导致地址不指向任何有意义的地方。
  • 通常当您添加一个成员函数时,会发生这种情况:
    • 函数的机器代码存储在所有类实例共享的位置(复制它没有意义,因为它在逻辑上是不可变的)
    • 一个隐藏的“this”指针在函数被调用时被传递给它,因此它知道它是在哪个对象上被调用的。
    • 这些都不需要实例中的任何存储空间。
  • 但是,当您至少添加一个 虚函数时,编译器通常还需要添加一个称为vtable 的数据 block 。 (阅读它)。这使得可以根据对象的当前运行时类型调用不同的代码(也称为多态性)。因此,您添加到类中的第一个虚函数可能确实增加了对象大小。

关于c++ - 将结构和类写入磁盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2889182/

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