我试图在结构中表示高清页面。下面的代码不起作用,因为 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/