Я попытался вычислить хэши для постоянных C-строк во время компиляции с помощью макросов. Это мой пример кода:
#include <stddef.h>
#include <stdint.h>
typedef uint32_t hash_t;
#define hash_cstr(s) ({ \
typeof(sizeof(s)) i = 0; \
hash_t h = 5381; \
for (; i < sizeof(s) - 1; ) \
h = h * 33 + s[i++]; \
h; \
})
/* tests */
#include <stdio.h>
int main() {
#define test(s) printf("The djb2 hash of " #s " is a %u\n", hash_cstr(#s))
test(POST);
test(/path/to/file);
test(Content-Length);
}
Теперь я запускаю GCC, чтобы показать листинг:
arm-none-eabi-gcc-4.8 -S -O2 -funroll-loops -o hash_test.S hash_test.c
И результат ожидаемый: все строки были удалены и заменены их хэшами. Но обычно я использую -Os для компиляции кода встроенных приложений. Когда я пытаюсь это сделать, у меня есть хэши только для строк, содержащих менее четырех символов. Я также попытался установить параметр max-unroll-times
и использовать GCC 4.9:
arm-none-eabi-gcc-4.9 -S -Os -funroll-loops \
--param max-unroll-times=128 -o hash_test.S hash_test.c
Я не могу понять причину такого поведения и как я могу расширить это ограничение на четыре символа.
constexpr
вместо макроса? - person M.M   schedule 17.12.2015constexpr
для C++, и пример выглядит как код C - person Basile Starynkevitch   schedule 17.12.2015.c
. Это не С++. Зачем меня сюда позвали? - person Ivan Aksamentov - Drop   schedule 17.12.2015.c
, следовательно, ОП хочет на самом деле C (а не C++) и, возможно, неправильно пометил свой вопрос. - person Basile Starynkevitch   schedule 17.12.2015-Os
и-O2
включают/отключают только флаги-fxxx
. Я пытался скомпилировать со всеми включенными флагами оптимизации и отключать их один за другим, пока не найду подходящую комбинацию около-Os
, достаточной для ОП. К моему удивлению, это не сработало:gcc -S -fauto-inc-dec -fcprop-registers -fdce -fdefer-pop ... -fomit-frame-pointer -funroll-loops -o hash_test.S hash_test.c && cat hash_test.S
: хеша нет :( - person YSC   schedule 18.12.2015