Каково различие между этими объявлениями в C?

Обычно двоичное дерево (std::map, которое вы в настоящее время используете) обеспечивает адекватную производительность. Ваш бюджет процессора должен быть очень маленьким.

Бинарный поиск, вероятно, не будет намного быстрее. Хеш-таблица (std::unordered_map) может быть решением.

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

std::unordered_map m(503); // 503 is a prime
m.emplace(123, 234);
m.emplace(2345, 345);

std::cout << m.find(123)->second; // don't use operator[] to avoid creating entries
std::cout << m.find(2345)->second;

Чтобы проверить качество функции хеширования, выполните итерацию по всем сегментам, вызвав bucket_size() и сложив что-либо выше 1 (то есть столкновение).

5
задан Jonathan Leffler 27 May 2015 в 17:30
поделиться

2 ответа

const int * i;

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

int * const i;

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

const volatile int ip;

Этот довольно хитер. Факт это ip const средства, из которых компилятор не позволит Вам изменить значение ip. Однако это могло все еще быть изменено в теории, например, путем взятия ее адреса и использования const_cast оператор. Это очень опасно и не хорошая идея, но она позволяется. volatile спецификатор указывает то любое время ip получен доступ, это должно всегда перезагружаться из памяти, т.е. это не должно кэшироваться в регистре. Это препятствует тому, чтобы компилятор делал определенную оптимизацию. Вы хотите использовать volatile спецификатор, когда у Вас есть переменная, которая могла бы быть изменена другим потоком, или если Вы используете ввод-вывод с отображенной памятью или другие аналогичные ситуации, которые могли бы вызвать поведение компилятор, не мог бы ожидать. Используя const и volatile на той же переменной довольно необычно (но законен) - Вы будете обычно видеть один, но не другой.

const int *i;

Это совпадает с первым объявлением.

34
ответ дан 18 December 2019 в 05:23
поделиться

Вы читаете объявления переменных в C/C++ справа налево, так сказать.

const int *i;  // pointer to a constant int (the integer value doesn't change)

int *const i;  // constant pointer to an int (what i points to doesn't change)

const volatile int ip;  // a constant integer whose value will never be cached by the system

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

4
ответ дан 18 December 2019 в 05:23
поделиться