статическое ЗУ по сравнению с памятью "кучи"?

Я работаю в ограниченной среде памяти и потребности создать строки динамично, но все еще иметь их не поднимают память "кучи". Делает это имеет смысл:

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
задан ashleysmithgpu 16 February 2010 в 10:03
поделиться

5 ответов

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

4
ответ дан 14 December 2019 в 13:34
поделиться

Я согласен с раскручиванием.

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

т.е.

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
ответ дан 14 December 2019 в 13:34
поделиться

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

0
ответ дан 14 December 2019 в 13:34
поделиться

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

1
ответ дан 14 December 2019 в 13:34
поделиться

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

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

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

0
ответ дан 14 December 2019 в 13:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: