小编use*_*100的帖子

使用std :: map的两个键的最佳方法是什么?

我有一个std :: map,我用它来存储x和y坐标的值.我的数据非常稀疏,所以我不想使用数组或向量,这会导致大量的内存浪费.我的数据范围从-250000到250000,但我最多只有几千点.

目前我正在使用两个坐标(即"12x45")创建一个std :: string并将其用作键.这似乎不是最好的方法.

我的其他想法是使用int64并将两个int32推入其中并将其用作密钥.

或者使用具有两个坐标的类.对要用作密钥的类有什么要求?

做这个的最好方式是什么?我宁愿不使用地图地图.

c++ stl

43
推荐指数
4
解决办法
5万
查看次数

由于内存耗尽而从NULL == malloc()恢复的策略

阅读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)

c memory malloc memory-management

9
推荐指数
1
解决办法
950
查看次数

估计格式化的snprintf()字符串的大小?

我正在考虑编写一个函数来估计至少来自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倍?

c

1
推荐指数
1
解决办法
777
查看次数

标签 统计

c ×2

c++ ×1

malloc ×1

memory ×1

memory-management ×1

stl ×1