2014-12-04 5 views
0

Я нашел это время читает код:Что делает FAST_FUNC в busybox?

char* FAST_FUNC bb_simplify_path(const char *path) 

Здесь char* является тип возвращаемого значения, но я не понимаю роль FAST_FUNC. Этот FAST_FUNC используется во многих местах.

В общем, что делает FAST_FUNC делать в busybox?

+0

, вероятно, ничего –

+1

Вы искали код для '#define FAST_FUNC'? – nneonneo

ответ

2

От include/platform.h:

/* FAST_FUNC is a qualifier which (possibly) makes function call faster 
* and/or smaller by using modified ABI. It is usually only needed 
* on non-static, busybox internal functions. Recent versions of gcc 
* optimize statics automatically. FAST_FUNC on static is required 
* only if you need to match a function pointer's type */ 
#if __GNUC_PREREQ(3,0) && defined(i386) /* || defined(__x86_64__)? */ 
/* stdcall makes callee to pop arguments from stack, not caller */ 
# define FAST_FUNC __attribute__((regparm(3),stdcall)) 
/* #elif ... - add your favorite arch today! */ 
#else 
# define FAST_FUNC 
#endif 

В основном, это активизирует архитектура-зависимая функция аннотацию, которая ускоряет вызов функций. Фактическая аннотация зависит от платформы (следовательно, от #if), но на x86/x86_64 (единственные в настоящее время реализуемые здесь платформы) она активирует условные вызовы «stdcall» в аннотированной функции. stdcall позволяет передавать некоторые аргументы функции в регистры вместо стека, что устраняет несколько обращений к памяти из последовательности вызова вызова функции.

+0

Итак, вы приводите некоторую загадочную документацию в исходном коде. Это едва полезно. Если бы вы могли перевести эту документацию на английский язык, чтобы мы могли ее понять, я бы пересмотрел ее. Когда Busybox использует этот макрос и почему? Почему не везде? Есть ли недостаток в использовании макроса? –

+1

Это мне совершенно понятно. Я не знал, что означает 'regparm', но предполагается, что он должен пропускать N аргументов в регистрах, и когда я посмотрел, это то, что он делает. –