Я вижу следующий шаблон, встречающийся довольно часто:
<code> b->last = ngx_cpymem(b->last, "
", sizeof ("
") - 1);
Обратите внимание, чтоСтрока литерала используется дважды. Извлечение из исходной базы nginx.
Компилятор должен иметь возможность объединять эти литералы, когда он встречается в модуле компиляции.
Мои вопросы:
- Убирают ли компиляторы коммерческого уровня (VC ++, GCC, LLVM / Clang) эту избыточность при обнаружении в модуле компиляции?
- Удаляет ли (статический) компоновщик такие избыточности, когдасвязывание объектных файлов.
- если применить 2, произойдет ли эта оптимизация во время динамического связывания?
- Если применимы 1 и 2, применяются ли они ко всем литералам.
Этивопросы важны, потому что это позволяет программисту быть многословным, не теряя эффективности - т. е. думать об огромных статических моделях данных, встроенных в программу (например, правила системы поддержки принятия решений, используемой внекоторый сценарий низкого уровня).
Редактировать
2 балла / разъяснения
Код выше написан признанным"мастер" программистПарень в одиночку написал nginx.
Я не спрашивал, какой из возможных механизмов буквального жесткого кодирования лучше.Поэтому не уходите от темы.
Редактировать 2
Мой оригинальный пример был довольно надуманным и ограничительным.В следующем фрагменте показано использование строковых литералов, встроенных во внутренние жестко запрограммированные знания.Первый фрагмент предназначен для синтаксического анализатора конфигурации, сообщающего ему, какие значения перечисления установить для какой строки, а второй - для более общего использования в качестве строки в программе.Лично я доволен этим, пока компилятор использует одну копию строкового литерала, и поскольку элементы являются статическими, они не входят в глобальные таблицы символов.
static ngx_conf_bitmask_t ngx_http_gzip_proxied_mask[] = {
{ ngx_string("off"), NGX_HTTP_GZIP_PROXIED_OFF },
{ ngx_string("expired"), NGX_HTTP_GZIP_PROXIED_EXPIRED },
{ ngx_string("no-cache"), NGX_HTTP_GZIP_PROXIED_NO_CACHE },
{ ngx_string("no-store"), NGX_HTTP_GZIP_PROXIED_NO_STORE },
{ ngx_string("private"), NGX_HTTP_GZIP_PROXIED_PRIVATE },
{ ngx_string("no_last_modified"), NGX_HTTP_GZIP_PROXIED_NO_LM },
{ ngx_string("no_etag"), NGX_HTTP_GZIP_PROXIED_NO_ETAG },
{ ngx_string("auth"), NGX_HTTP_GZIP_PROXIED_AUTH },
{ ngx_string("any"), NGX_HTTP_GZIP_PROXIED_ANY },
{ ngx_null_string, 0 }
};
, за которыми следуют:
static ngx_str_t ngx_http_gzip_no_cache = ngx_string("no-cache");
static ngx_str_t ngx_http_gzip_no_store = ngx_string("no-store");
static ngx_str_t ngx_http_gzip_private = ngx_string("private");
Тем, кто остался по теме, браво!