[c] как в макрос передать макрос?
zurg:/tmp$ cat 1.c
#define TWICE(x) x, x
#define FOUR_TIMES(x) TWICE(x TWICE(x)
#define EIGHT_TIMERS(x) FOUR_TIMES(x FOUR_TIMES(x)
#define SIXTEEN_TIMES(x) EIGHT_TIMERS(x EIGHT_TIMERS(x)
char a[] = {SIXTEEN_TIMES('a')};
zurg:/tmp$ gcc -E 1.c
# 1 "1.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "1.c"
char a[] = {'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a'};
Дело в том, что для определения SIXTY_FIVE_THOUSAND_FIVE_HUNDRED_THIRTY_SIX_TIMES потребуется шестнадцать шагов - а могло бы пять...
char a[] = {[0 ... 65535] = 'a'};
char a[] = {[0 ... 65535] = 'a'};Гы.
Это в каком стандарте появилось?
(gcc 3 проглотил, да. Я от него не ждал.)
хз. может c99, а может гнутое расширение.
#define TWICE(x...) x, x
#define FOUR_TIMES(x) TWICE(TWICE(x
#define SIXTEEN_TIMES(x) FOUR_TIMES(FOUR_TIMES(x
char a[] = {SIXTEEN_TIMES('a')};
localhost ~/test $ gcc -E macro.c
# 1 "macro.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "macro.c"
char a[] = {'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a'};
Ох, блин! А когда появились variadic marcros?
Variable-argument macros were introduced in the ISO/IEC 9899:1999 (C99) revision of the C Programming Language standard in 1999.Ну, короче, тоже новомодная хрень.
Ох, блин! А когда появились variadic marcros?Рекомендую к изучению: http://gcc.gnu.org/onlinedocs/cpp/Argument-Prescan.html
а также окрестные
PS или ты вообще про variadic marcros? Давным-давно уже в gcc.
Ну, короче, тоже новомодная хрень.99 год, прошлый век, 10 лет тому назад
это новомодная хрень?
Ты знаешь учебник, покрывающий С99, с уровнем признания K&R?
iso9899-c99.pdf там не такие уж и большие изменения.
а Fillchar(a,sizeof(a'a') на сях отсутствует или это уже не модно?
а Fillchar(a,sizeof(a'a') на сях отсутствует или это уже не модно?это будет выполнено во время исполнения, а всё предыдущее было при компиляции
Ты memset, что ли, имеешь в виду? Я привык вычисления делать на этапе инициализации. int main {FILE *f = fopen("filename.ext", "r"); unsigned char a[4] = {'\0'}; size_t nread = (f ? fread(a, sizeof(char 4, f) : 0); long result = (long)a[0] << 24 + (long)a[1] << 16 + (long)a[2] << 8 + (long)a[3]; return printf("%d\n", result) * fclose(f);}
с другой стороны memset быстрее чем чтение с диска
с другой стороны memset быстрее чем чтение с дискаэто проще одних махом решить через обработку проги exe-packer-ом.
тогда страницы кода не будут шарится между экземплярами
это проще одних махом решить через обработку проги exe-packer-ом.Который при распаковке тоже сделает не быстрее, чем memset?
не, это будет специальный пакер который сделает memset
memset,да, я именно его имел ввиду, но не мог вспомнить.
мне кажется что в данном случае лучше потратить примерно 16384 такта (на 32-разрядной машине чем 64к памяти (целых
в идеале оно должно соптимизироваться во что-то вроде
mov ecx, 16384
mov edi, offset a
mov eax, 'aaaa'
rep stosd
upd
и да, в случае очень большого куска заливаемой памяти возможно будет распараллелить этот процесс на пару-четверку ядер =)
64к памяти (целых четыре страницы!)orly?
в идеале оно должно соптимизироваться во что-то вродене факт, что на современных cpu это не самый оптимальный вариант (это было быстро для старых поколений процессоров). Плюс, такты непонятно откуда взяты.
Правда и memset на старых компиляторах (когда-то супер-популярной для многих проектов 6й студии, да и у 7й, вроде, тоже) реализован крайне неэффективно.
Который при распаковке тоже сделает не быстрее, чем memset?скорее unpacker будет быстрее, потому что распаковывать будет последовательно, а memset-ы будут вызывать неупорядоченные обращения к памяти.
+ заодно и другие участки(код, строки и т.д.) тоже будут сжаты, а не только этот кусок.
тогда страницы кода не будут шарится между экземплярамиесть такое, но код сейчас обычно маленький, по сравнению с данными, и много параллельных копий редко запускается, что могло дать выигрышь по скорости последующих запусков.
тот же браузер - код занимает метров 30 максимум, а после открытия десятка страниц - памяти отжирается все 300.
но код сейчас обычно маленький, по сравнению с данными, и много параллельных копий редко запускается, что могло дать выигрышь по скорости последующих запусковДело не только в скорости запусков. Да и отношение код/данные смотря на что смотреть. Для популярных на данной системе библиотек очень полезно будет если они будут шариться.
Имхо, в данном случае ваши макросы неоправданно снижают читаемость кода.
виноват, протупил. не 4, а 16 страниц по 4к каждая.
читаемость кодаЧувак, это DizziDen, ему похуй, он просто получает fun
> Чувак, это DizziDen
У человека, собирающегося писать обработку звука на хаскеле,
свои воззрения на читаемость кода.
---
...Я работаю антинаучным аферистом...
Обработку звука на хаскеле, подозреваю, тоже можно неплохо написать.
http://shootout.alioth.debian.org/u64q/benchmark.php?test=ma...
Вот тут видно, что хаскель всего в 2 раза менее оптимальный код выдаёт, чем GCC С++, к которому лично у меня уже выработалось стойкое отвращение.
Имхо, в данном случае ваши макросы неоправданно снижают читаемость кода.Ну я за memset голосую, если что.
---
ZZZZYU. Ты его не слушай, он тебя, куда хочешь, сагитирует!
hruid. Да, это он может.
У человека, собирающегося писать обработку звука на хаскеле,Это технологии будущего, между прочим, ибо компьютер, способный исполнить код синтезатора на хаскеле за разумное время, раньше чем через тридцать лет не появится.
свои воззрения на читаемость кода.
ЗЫ. На самом деле, хаскель в этом вопросе по производительности не сильно хуже сей, просто там есть нюансы, которые меня смущают, а всем остальным.
хаскель в этом вопросе по производительности не сильно хуже сей, просто там есть нюансы...
-Гоги, расскажи мнэ, что такое нюанс?
-Э... вай, сматры: если ты засунешь нос ко мнэ в жопу. Получится, что у тэбя в жопе нос... и у мэня в жопе нос.... но есть нюанс.....
Оставить комментарий
apl13
Неохота четыре раза писать TWICE там, где можно два раза написать FOUR_TIMES.