Макрос GLib g_slice_new вопросы

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

В glist.h я увидел макрос _g_list_alloc0 и хочу знать, как он реализуется. Поэтому я возвращаюсь к нему.

#define _g_list_alloc0() g_slice_new0 (GList)

Затем вернитесь к макросу g_slice_new0.

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

Хорошо, отслеживание до

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)))

Меня смущают последние два макроса 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__

? Это какое-то зарезервированное ключевое слово для бойкого?

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


person user1323328    schedule 28.07.2015    source источник


Ответы (2)


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

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

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

person viraptor    schedule 28.07.2015

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

Расширяется до атрибута функции GNU C alloc_size, если компилятор достаточно новый gcc. Этот атрибут сообщает компилятору, что функция возвращает указатель на память, размер которой указан x-м параметром функции.

#define G_GNUC_MALLOC __attribute__((__malloc__))

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

person LPs    schedule 28.07.2015