将文件读入std :: vector <char>的有效方法?
我想避免不必要的副本。 我正在瞄准的东西:
std::ifstream testFile( "testfile", "rb" ); std::vector<char> fileContents; int fileSize = getFileSize( testFile ); fileContents.reserve( fileSize ); testFile.read( &fileContents[0], fileSize );
(这不起作用,因为reserve
实际上并没有插入任何东西,所以我不能访问[0]
)。
当然, std::vector<char> fileContents(fileSize)
可以工作,但是初始化所有元素会有开销( fileSize
可能比较大)。 相同的resize()
。
这个问题并不那么重要,这将是开销。 相反,我只是想知道是否有另一种方式。
规范forms是这样的:
#include<iterator> // ... std::ifstream testFile("testfile", std::ios::binary); std::vector<char> fileContents((std::istreambuf_iterator<char>(testFile)), std::istreambuf_iterator<char>());
如果你担心重新分配,那么在向量中保留空间:
#include<iterator> // ... std::ifstream testFile("testfile", std::ios::binary); std::vector<char> fileContents; fileContents.reserve(fileSize); fileContents.assign(std::istreambuf_iterator<char>(testFile), std::istreambuf_iterator<char>());
如果您想要真正的零拷贝读取,即消除从内核到用户空间的复制,只需将该文件映射到内存中即可。 编写你自己的映射文件包装器或使用boost::interprocess
。
如果我正确理解你,你想读取每个元素,但不想将它们全部加载到fileContents
,对吗? 我个人不认为这会造成不必要的副本,因为多次打开文件会降低性能。 在这种情况下,只读入fileContents
向量是一个合理的解决scheme。