2015-07-15 3 views
0

Я хочу кодировать местоположение - скажем, FILE/LINE - каждый раз, когда я занимаюсь распределением памяти. Это более 3000 в моей кодовой базе, поэтому я действительно не хочу его жестко кодировать.C: эффективное кодирование местоположения кода

Я использовал макрос, который просто проходит в ФАЙЛ, ЛИНИЯ, который прекрасно работает.

Теперь я хочу сохранить это с каждым распределением, чтобы он был сжат. Я использовал минимальный совершенный хеш для FILE, который делает пару (FILE, LINE) подходящей в 32-битном целом.

Однако вычисление MPH при каждом распределении является слишком дорогостоящим (в основном потому, что оно проходит через строку, вычисляющую первичный хэш). Поскольку все строки являются постоянными, MPH является постоянным и все постоянным, должен быть более быстрый способ вычислить это.

В любом случае, кто-нибудь знает, как лучше вычислить местоположения кодов, чтобы их можно было искать и хранить эффективным образом (я также посмотрел на макрос PP_COUNTER библиотеки boost)? Спасибо!

+0

Почему бы вам просто не сжать файл после того, как закончите? – Barmar

+1

Напишите программу, которая предварительно препроцессирует ваш код и вводит уникальный номер в каждом вызове функции распределения, плюс создает статическую таблицу, отображающую числа обратно в файл, пары линий. Тогда вам не нужно хеширование во время выполнения. – zwol

+1

Добавить статическую переменную, содержащую 'MPH (FILE)', поэтому она просто вычисляется один раз для каждого файла. Затем соедините это с 'LINE', когда вы делаете выделение. – Barmar

ответ

1

Расположение кода уже эффективно кодируется { __FILE__, __LINE__ }.

Макрос __FILE__ расширяется строковый литерал, который (в C99, и, вероятно, раньше) является «используется для инициализации массива статической длительности хранения» и вы передаете в его адрес, что все, что вам нужно, и не нужно сжимать. Я сделал это так (необязательно, включая текущее имя функции), без проблем, в VMS C, AIX C и MSVS C, и это было очень полезно.

N.B.

  • В теории, действительно беден компилятор может не строковые литералы пул, даже не __FILE__, что приводит к раздутой объектный код, но кажется, что вряд ли в крайности!
  • Пока ваш компилятор создает пул литералов, вы можете рассчитать хэш по адресу, если он вам нужен.
  • Я видел, что макросы функций имени C++ могут быть функциональными вызовами, поэтому этот метод может быть неприменим там.
+0

Спасибо! Я не был уверен в объединении литералов, что-то, на что я могу следить. Основная проблема заключается в том, что общая сумма {__FILE__, __LINE__} больше 8 байтов. И нет простого способа сделать MPH на этом, так как адреса не известны до времени выполнения. Таким образом, вам придется либо прибегнуть к хакерству (потому что у адресов, вероятно, будут одни и те же ведущие 4 байта или что-то еще), либо хеш-реализация с коллизиями и весь этот джаз. Разрешимый, но большой PITA. – user3385120

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