代码之家  ›  专栏  ›  技术社区  ›  ashleysmithgpu

静态内存与堆内存?

  •  5
  • ashleysmithgpu  · 技术社区  · 16 年前

    我在内存受限的环境中工作,需要动态地创建字符串,但仍然让它们不占用堆内存。这是否有意义:

    static char staticStringBuffer[10240];
    static size_t staticStringWatermark = 0;
    
    void createString( const char * something, const char * somethingElse ) {
        char buf[1024];
        strcat(buf, "test");
        strcat(buf, something);
        strcat(buf, somethingElse);
    
        strcat(&staticStringBuffer[staticStringWatermark], buf);
        staticStringWatermark += strlen(buf+1);
    }
    

    这可能需要大量的编译,但我所要做的是将静态内存牺牲为堆内存吗?

    谢谢你^^

    5 回复  |  直到 16 年前
        1
  •  4
  •   unwind    16 年前

    当然,这取决于特定环境在加载程序时所做的操作;程序的静态数据放在哪里?在许多操作系统上,程序被加载到堆内存中并从内存中运行,因此静态数据仍然会出现在堆中。

        2
  •  1
  •   wallyk    16 年前

    那就行了。如果strlen(something)+strlen(somethinggelse)>=10240,则需要注意不要写超过静态缓冲区的末尾,这在示例中会发生。

        3
  •  1
  •   Tim Post Samir J M Araujo    16 年前

    我同意放松。

    当强制使用静态分配时,我通常在使用它们的范围内(即在函数本身内)分配这些块。

    即

    static char *createstring(char *foo, char *bar)
    {
        static char ret[size];
    
        /* do some work, make sure you pay attention to the printf sub system when it
           tells you how many bytes weren't printed ... */
    
        return ret;
    }
    

    …当然,确保createString()中的条目受到某种互斥的保护,并且调用方不需要修改结果。

    取决于编译器,ymmv。你真的需要全球化吗?

        4
  •  0
  •   Andy Shellam    16 年前

    如果内存真的有那么大的限制,难道不能直接将/strcat附加到staticStringBuffer而不是临时buf上吗?

    我认为你知道这段代码不是线程安全的吗?你可能不需要这么做,只是确定一下。

    也可以使用strncat而不是strcat-它可以防止缓冲区溢出。

        5
  •  0
  •   anon    16 年前

    如果需要动态创建字符串,则需要一个堆,但不一定是随C运行库提供的默认堆。如果您处于非常有限的环境中,请不要动态创建字符串。