我有一种情况,我需要处理大量(许多GB)的数据量:
每次迭代中的数据都是独立的.
我的问题是,我想最小化(如果可能消除)堆分配的内存使用量,因为它目前是我最大的性能问题.
有没有办法将C字符串(char*)转换为stl C++字符串(std :: string),而不需要std :: string来内部分配/复制数据?
或者,我可以使用stringstreams或类似的东西来重用大缓冲区吗?
编辑:感谢您的回答,为清楚起见,我认为修改后的问题将是:
如何有效地构建(通过多个附加)一个stl C++字符串.如果在循环中执行此操作,其中每个循环完全独立,我如何重新使用此分配的空间.
我的应用程序存在内存问题,包括复制大量字符串,使用与许多哈希表中的键相同的字符串等.我正在寻找我的字符串的基类,这使得它非常有效.
我希望:
我的平台是Linux上的g ++(但这不太重要).
你知道这样的图书馆吗?
作为一名C++程序员,我有时需要使用C语言处理内存缓冲区.例如:
char buffer[512];
sprintf(buffer, "Hello %s!", userName.c_str());
Run Code Online (Sandbox Code Playgroud)
或者在Windows中:
TCHAR buffer[MAX_PATH+1]; // edit: +1 added
::GetCurrentDirectory(sizeof(buffer)/sizeof(TCHAR), &buffer[0]);
Run Code Online (Sandbox Code Playgroud)
上面的示例是我通常如何创建本地缓冲区(本地堆栈分配的char数组).但是,有许多可能的变化,因此我对您对以下问题的答案非常感兴趣:
&buffer[0]比传递更好的编程风格buffer?(我更喜欢&buffer[0].)static char buffer[N];)更快吗?是否还有其他论据支持或反对?const char *.这(通常)是好还是坏?(我确实意识到调用者需要自己创建副本以避免下一次调用会改变之前的返回值.)static char * buffer = new char[N];,永远不要删除缓冲区并在每次调用时重复使用它.sprintf_s,memcpy_s......变种?(Visual Studio一直试图让我相信这一点很长时间,但我想要第二个意见:p)这是正确的,它可以正常工作
string str("in.dat");
ifstream fin(str.c_str(), ios::binary | ios::ate );
.
.
.
//Do I need to clear the string before assigning new name???
str = "out.dat";
ofstream fout(str.c_str(), ios::binary); //seems to work
Run Code Online (Sandbox Code Playgroud)
问候