статическая память против кучи памяти? - PullRequest
5 голосов
/ 16 февраля 2010

Я работаю в среде с ограниченным объемом памяти, и мне нужно динамически создавать строки, но они не занимают кучи памяти. Так имеет ли это смысл:

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 ]

4 голосов
/ 16 февраля 2010

Это, конечно, зависит от того, что делает ваша конкретная среда при загрузке вашей программы; где находятся статические данные программы? Во многих операционных системах программа загружается в динамическую память и запускается оттуда, поэтому ваши статические данные все равно окажутся в куче.

1 голос
/ 16 февраля 2010

Я согласен с раскрутить.

Когда меня заставляют использовать статическое распределение, я обычно распределяю эти блоки в пределах области, в которой они используются, то есть в самой функции.

т.е.

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. Вы действительно должны сделать это глобальным?

1 голос
/ 16 февраля 2010

Это будет работать. Необходимо соблюдать осторожность, чтобы не записывать после конца статического буфера, что может произойти в вашем примере, если strlen (что-то) + strlen (somethingElse)> = 10240.

0 голосов
/ 16 февраля 2010

Если вам нужно динамически создавать строки, вам нужна куча, хотя не обязательно та, которая по умолчанию поставляется с вашей библиотекой времени выполнения C. Если вы находитесь в очень ограниченной среде, не создавайте строки динамически.

0 голосов
/ 16 февраля 2010

Если память действительно настолько ограничительна, не могли бы вы добавить / strcat прямо в staticStringBuffer, а не в временный буфер?

Я так понимаю, вы знаете, что этот код не является потокобезопасным? Тебе, вероятно, это не нужно, а просто проверять.

Также используйте strncat вместо strcat - это предотвращает переполнение буфера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...