我有一个std :: map,我用它来存储x和y坐标的值.我的数据非常稀疏,所以我不想使用数组或向量,这会导致大量的内存浪费.我的数据范围从-250000到250000,但我最多只有几千点.
目前我正在使用两个坐标(即"12x45")创建一个std :: string并将其用作键.这似乎不是最好的方法.
我的其他想法是使用int64并将两个int32推入其中并将其用作密钥.
或者使用具有两个坐标的类.对要用作密钥的类有什么要求?
做这个的最好方式是什么?我宁愿不使用地图地图.
阅读Martin Sustrick撰写的有关在C++中防止"未定义行为"的问题的博客,特别是由于内存耗尽而导致malloc()失败的问题,我被提醒了很多次,我很沮丧地知道是什么在这种情况下做.
对于虚拟系统来说,这种情况很少见,但是在嵌入式平台上,或者在击中虚拟系统时伴随着性能下降等同于失败的情况,正如Martin对ZeroMQ的情况一样,我决定找到一个可行的解决方案,并且做到了.
我想向StackOverflow的读者询问他们是否尝试过这种方法,以及他们使用它的经验.
解决方案是在程序开始时调用malloc()从堆中分配一块备用内存,然后使用该备用内存池来避免内存耗尽.这个想法是为了防止投降有利于有序撤退(我正在阅读Kesselring昨晚对意大利的辩护的说法),其中错误信息和IP套接字等工作时间足够长(希望)至少告诉用户发生了什么.
#define SPARE_MEM_SIZE (1<<20) // reserve a megabyte
static void *gSpareMem;
// ------------------------------------------------------------------------------------------------
void *tenacious_malloc(int requested_allocation_size) {
static int remaining_spare_size = 0; // SPARE_MEM_SIZE;
char err_msg[512];
void *rtn = NULL;
// attempt to re-establish the full size of spare memory, if it needs it
if (SPARE_MEM_SIZE != remaining_spare_size) {
if(NULL != (gSpareMem = realloc(gSpareMem, SPARE_MEM_SIZE))) {
remaining_spare_size = SPARE_MEM_SIZE;
// "touch" the memory so O/S will allocate physical …Run Code Online (Sandbox Code Playgroud) 我正在考虑编写一个函数来估计至少来自sprintf(),snprintf()函数的格式化字符串的全长.
我的方法是解析格式字符串以找到各种%s,%d,%f,%p args,创建strlen()s,itoa()s和strlen(format_string)的运行总和以获得保证的内容足够大,可以为snprintf()分配一个合适的缓冲区.
我知道以下工作,但它需要10倍的时间,因为所有printf()函数都非常灵活,但非常慢,因为如果它.
char c;
int required_buffer_size = snprintf(&c, 1, "format string", args...);
Run Code Online (Sandbox Code Playgroud)
这已经完成了吗? - 通过建议的方法,或其他一些合理有效的方法 - IE:比sprintf()变体快5-50倍?