Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[13.59.82.167] |
|
Сообщ.
#1
,
|
|
|
unit Atomic; interface function AtomicPInc(var Dest: Shortint): Shortint; inline; function AtomicIncP(var Dest: Shortint): Shortint; inline; implementation function AtomicPInc(var Dest: Shortint): Shortint; begin Result := AtomicIncP(Dest) + 1; end; function AtomicIncP(var Dest: Shortint): Shortint; begin Result := AtomicIncrement(Dest) - 1; end; end. {$APPTYPE CONSOLE} uses Atomic; var X: Shortint; begin AtomicIncP(X); AtomicPInc(X); end. Вызов AtomicPInc(X) не-inline-овый, а через call. Меняем местами AtomicPInc и AtomicIncP в unit'е (именно в секции implementation, а не interface) - всё становится нормально. Меняем unit на: unit Atomic; interface function AtomicPInc(var Dest: Shortint): Shortint; inline; function AtomicIncP(var Dest: Shortint): Shortint; inline; implementation function AtomicPInc(var Dest: Shortint): Shortint; begin Result := AtomicIncrement(Dest); end; function AtomicIncP(var Dest: Shortint): Shortint; begin Result := AtomicPInc(Dest) - 1; end; end. Что это за тупость? Или это фича такая? Кто может объяснить? p.s. Это что в XE3, что в Tokyo - всё одно! |
Сообщ.
#2
,
|
|
|
Цитата Jin X @ Компилим, смотрим через отладчик. Вызов AtomicPInc(X) не-inline-овый, а через call. Это не баг эта фича. В Си++ аналогично. Если компилятор считает что так быстрее, то он не обязан инлайнить. |
Сообщ.
#3
,
|
|
|
Отчего так будет быстрее?
И почему если я меняю функции местами, то всё inline-ится... |
Сообщ.
#4
,
|
|
|
Цитата Jin X @ почему если я меняю функции местами, то всё inline-ится... А вы уверены, что компилятор целиком обновил exe? Он может не все функции пере компилировать. |
Сообщ.
#5
,
|
|
|
Цитата Pavia @ В смысле, DCU старый остался? Нет, оба PAS-файла перекомпилируются. А вы уверены, что компилятор целиком обновил exe? Он может не все функции пере компилировать. |