2015-07-28 3 views
0

Этот вопрос связан с GLib для программирования c. Исходный код здесь: https://github.com/GNOME/glib/blob/master/glib/gslice.hGLib macro g_slice_new вопросы

В glist.h, я увидел _g_list_alloc0 макросъемки, и я хочу знать, как это implements.So я обратно дорожку.

#define _g_list_alloc0() g_slice_new0 (GList) 

Далее назад отслеживание макро g_slice_new0

#define g_slice_new0(type) ((type*) g_slice_alloc0 (sizeof (type))) 

Ok, обратно отслеживание

gpointer g_slice_alloc0 (gsize block_size) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1); 

Для G_GNUC_MALLOC, я нашел, что это на самом деле:

#define G_GNUC_MALLOC __attribute__((__malloc__)) 
#define G_GNUC_ALLOC_SIZE(x) __attribute__((__alloc_size__(x))) 

Я смущен о la два макроса G_GNUC_MALLOC и G_GNUC_ALLOC_SIZE.

Могу ли я заменить G_GNUC_ALLOC_SIZE (1) и G_GNUC_MALLOC с:

__attribute__((__alloc_size__(1))) 
__attribute__((__malloc__)) 

Таким образом, заменить макрос

gpointer g_slice_alloc0 (gsize block_size) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1); 

Макрос фактически определяет так:

gpointer g_slice_allo0 (gsize block_size) 
__attribute__((__malloc__)) __attribute__((__alloc_size__(1))) 

Мой вопрос: Что такое выражение

__attribute__((__malloc__)) __attribute__((__alloc_size__(1))) 

работает или создается? Я думаю, это работает как

malloc(sizeof()) 

которые выделяют память на основе sizeof. Почему бы просто не использовать malloc (sizeof()) вместо этого завершенного выражения? Что такое

__attribute__ 

? Это зарезервированное ключевое слово для glib?

gpointer g_slice_alloc0 (gsize block_size) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1); 

Каков тип выражения? Это не макро или typedef. Является ли это функцией с макросом в качестве имени функции? Любой может проанализировать это для меня?

оригинальный ссылка здесь: https://github.com/GNOME/glib/blob/master/glib/gslice.h

ответ

3

Вы можете прочитать атрибуты здесь: https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html

malloc один «сообщает компилятору, что функция является таНос типа». «alloc_size» используется, чтобы сообщить компилятору, что возвращаемое значение функции указывает на память, где размер задается одним или двумя параметрами функций ».

Это все для оптимизации для компилятора. Эти атрибуты не изменяют работу функции, они просто позволяют компилятору производить лучший вывод.

0
#define G_GNUC_ALLOC_SIZE(x) __attribute__((__alloc_size__(x))) 

Раскрывается в GNU C alloc_size атрибут функции, если компилятор достаточно новый НКУ. Этот атрибут сообщает компилятору, что функция возвращает указатель на память размера, заданного параметром xth функции.

#define G_GNUC_MALLOC __attribute__((__malloc__)) 

Раскрывается в атрибуте функции таНос GNU C, если компилятор GCC. Объявление функции как malloc обеспечивает лучшую оптимизацию функции. Функция может иметь атрибут malloc, если он возвращает указатель, который гарантированно не будет псевдонимом с любым другим указателем при возврате функции (на практике это означает новую выделенную память).

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