我试图在结构中表示HD页面。下面的代码不起作用,因为page_size不是常量。
int page_size = 4096;
struct page {
char data[page_size];
/* some methods */
}
由于我正在构建并随机访问页面数组,如果我可以将页面视为大小为page_size的固定长度结构,那将是很好的。如果可能的话,我想在程序开始时从配置文件中读取page_size,或者从操作系统获取它(例如,Windows上的GetDiskFreeSpace())。显然,只有少数现实的页面大小,但我想不出一种方法来利用它。
感谢任何帮助。
谢
答案 0 :(得分:4)
不。你发现,你不能。编译器需要可靠且经常地知道其数据结构的大小,才能完成其工作。
我假设页面数据不是struct
的唯一内容。您可能在页面中有一些关于页面的标题/管理信息以及文本。
通常的解决方案是让你的struct包含指向实际文本的char *
。然后,该文本可以在您需要的任何大小的内存malloc()
'或calloc()
中。唉,这意味着每当你进行移动结构的操作时,你必须记住将外部文本与结构一起移动,并且当你摆脱结构时,内存管理文本...通常的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);
每页有一个指针的开销(当然可以接受),并且您的页面在内存中是物理上连续的。还有什么可以问的? :)
答案 1 :(得分:2)
{C++}
如果要在运行时确定大小,为什么不能使用std::vector
?
int page_size = 4096; //or any variable
class page{
std::vector<char> PAGE;
public:
page():PAGE(page_size){}
};
答案 2 :(得分:1)
[C ++]
你可以这样做:
int page_size = 4096;
struct page
{
char *pData;
page() : pData(new char[page_size])
{
}
~page()
{
delete[] pData;
}
/* some methods */
}
相反。
答案 3 :(得分:0)
C和C ++要求数组长度为编译时常量。 C99向C引入了variable length arrays,但我不确定你是否可以在结构中使用它们。
答案 4 :(得分:0)
如果它只是你想要的文字,最简单的方法可能是
struct page {
std::string data;
/* some methods */
}
这就是我问C或C ++的原因,因为这在C中不可用。
答案 5 :(得分:-1)
你可以使用
#define PAGE_SIZE 4096
struct page {
char data[PAGE_SIZE];
/* some methods */
}
使用autoconf automake,您可以自定义PAGE_SIZE