2016-07-09 4 views
2

Мы переносим часть нашего кода с C++ 03 на C++ 14 и везде, где есть некоторое увеличение производительности, мы хотим использовать функции C++ 14. Теперь в одном из наших проектов мы разбор CSV на основе столбцов имен, и эти имена столбцов объявляются в одном заголовочном файле, как это:constexpr string vs const string

const string ITEM_NAME = "Item Name"; 
const string ITEM_ID = "Item Id"; 

есть сто констант, как это так, что я хочу знать, есть ли значительный выигрыш Performace если я изменить выше код на что-то вроде этого:

constexpr string ITEM_NAME = "Item Name"; 
constexpr string ITEM_ID = "Item Id"; 

Также существует лимит на количество constexpr, которые мы можем иметь в нашем двоичном формате, поскольку они должны храниться в памяти только для чтения?

Может ли компилятор автоматически оптимизировать старый код C++ 03 и переместить константные переменные в память только для чтения, и это не стоит?

+1

Off topic: Похоже, ваша команда загрязняет глобальное пространство имен «использованием пространства имен std;» в заголовке или в некоторых чрезвычайно широких областях. Рискованный и доставит вам много проблем в некоторых местах. – user4581301

+1

нет, у нас есть все эти константы внутри пространства имен csvconst – Kapil

+0

Ha! Научите меня использовать «есть» вместо «может быть». Я потратил слишком много времени, мучившись над неправильным формулированием перед публикацией. Я стою. – user4581301

ответ

7

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

Вы должны просто придерживаться const, если у вас нет конкретной причины, почему constexpr работает и const не работает.

Если вам действительно нужны переменные в постоянной памяти, то ни const, ни constexpr не отличаются. Я бы только ожидал, что тривиальные типы будут надежно помещаться в постоянное запоминающее устройство, а std::string, конечно, не является тривиальным типом. («Тривиальный тип» является техническим термином.)

+0

Можете ли вы привести пример, где выражения, не являющиеся constexpr, не могут быть оценены. – Kapil

+2

Операции компиляции Kapil, такие как специализирование шаблонов и размер массива. Ничего, что вы могли бы скомпилировать в C++ 03 с 'const', поэтому вы должны быть хорошими без изменений. – user4581301

2

Нет, я бы не ожидал, что будет достигнуто повышение производительности.

Язык C++ не указывает максимальное ограничение на количество объектов/методов constexpr. Любые ограничения будут наложены вашим компилятором и/или операционной системой.

Язык C++ не указывает, размещает ли компилятор const переменные во что-то, что называется «только для чтения». Верно, что современные операционные системы имеют сложные реализации виртуальной памяти и адресного пространства и предоставляют приложениям определение различных областей виртуального адресного пространства с различными свойствами, таких как чтение/запись и чтение/только, а современные компиляторы C++ в полной мере используют ресурсов операционной системы и будет размещать объекты, которые обозначаются как «только для чтения» в отдельном сегменте памяти, для достижения оптимальной производительности виртуальной памяти.

Смежные вопросы