gpt4 book ai didi

c++ - 我可以使用变量来指定结构成员数组的大小吗?

转载 作者:太空狗 更新时间:2023-10-29 20:31:53 25 4
gpt4 key购买 nike

我试图在结构中表示高清页面。下面的代码不起作用,因为 page_size 不是常量。

int page_size = 4096;

struct page {

char data[page_size];

/* some methods */
}

因为我正在构建和随机访问页面数组,所以如果我可以将页面视为大小为 page_size 的固定长度结构会很好。如果可能的话,我想在程序开始时从配置文件中读取 page_size,或者从操作系统中获取它(例如,Windows 上的 GetDiskFreeSpace())。显然,只有少数几个实际的页面大小,但我想不出一种方法来利用它。

感谢任何帮助。

弗兰克

最佳答案

没有。正如你所发现的,你不能。编译器需要可靠且持续地了解其数据结构的大小才能完成其工作。

我假设页面数据不是您的 struct 的唯一内容。你可能有一些关于你的页面的标题/管理信息以及文本。

常见的解决方案是让您的结构包含指向实际文本的 char *。然后该文本可以在内存块中 malloc()calloc() 到您需要的任何大小。 las,这意味着无论何时执行移动结构的操作,您都必须记住将外部文本与您的结构一起移动,并且当您摆脱结构时内存管理文本......通常的 C 头痛。


编辑

有一些明智的“标准”方法可以做这种事情。这是一个建议:

typedef char *page_ptr;
int page_size = discover_page_size();
int max_page_count = discover_max_page_count();
int pages_stored = 0;
page_ptr *page_pointers = calloc(max_page_count, sizeof(page_ptr));
char *pages = calloc(max_page_count * page_size, sizeof(char));
page_pointers[0] = pages;
int i;
for (i=1; i<max_page_count; i++) {
page_pointers[i] = page_pointers[i-1] + page_size;
}

现在您可以将 page_pointers 视为一个页面数组,做类似的事情

read(filedesc, page_pointers[page_count++], page_size);

memmove(page_pointers[69], page_pointers[42], page_size);

每页有一个指针的开销(当然可以接受),并且您的页面在内存中物理上是连续的。你还能问什么? :)

关于c++ - 我可以使用变量来指定结构成员数组的大小吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3263457/

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