2016-01-11 3 views
2

Я пытаюсь понять, что делает этот код. Я анализирую код malloc моего профессора, и он выполняет эту функцию в своем коде. Я не понимаю, почему он это делает. Для меня он просто возвращает столько же выделенного места.Разве это не возвращает оригинальный размер?

static inline size_t word_align(size_t size) { 
    return size + (sizeof(size_t) - 1) & ~(sizeof(size_t) - 1); 
} 
+5

Это округляет до кратного sizeof (size_t) – immibis

+0

Очевидная вещь для вас здесь - это * test * it. Назовите его значениями, например, с 0 по 16, и посмотрите, что вы получите. Вы также можете посмотреть значение 'sizeof (size_t)'. Ничего из этого не требуется, чтобы задать вопрос здесь. Когда вы говорите: «для меня он просто возвращает то же количество выделенного пространства», это, по-видимому, означает, что вы все это сделали и обнаружили, что он всегда возвращает тот же самый номер, который он задает. Но ясно, что нет. –

ответ

4

Вы могли бы увидеть это сами: простой пример показывает выравнивание слов.

#include <stdio.h> 

size_t word_align(size_t size) 
{ 
    return size + (sizeof(size_t) - 1) & ~(sizeof(size_t) - 1); 
} 

int main(void) 
{ 
    size_t i; 
    for (i=1; i<10; i++) 
     printf("%zu %zu\n", i, word_align(i)); 
    return 0; 
} 

выход программы:

1 4 
2 4 
3 4 
4 4 
5 8 
6 8 
7 8 
8 8 
9 12 
+0

Это именно то, что OP должен был сделать для себя перед публикацией. Это также будет варьироваться от одной системы до мелодии в зависимости от размера 'size_t', но основной характер того, что он делает, будет таким же. –

+0

По какой-то причине я сам убедился, что '&' имел приоритет оператора над '+' и не мог понять всю жизнь меня, почему он что-то делал ... Тем не менее, в конечном итоге это показало. –

+0

@R_Kapp [приоритет] (https://msdn.microsoft.com/en-us/library/2bxt6kc4.aspx) –

1

код делает выравнивание 8-байт для запрашиваемой памяти. Это обычная практика в системном программировании и классическая техника.

Почему это делается? Материал из Википедии:

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

Чтобы понять код лучше в скобках, чтобы сделать приоритет оператора «+» и «&» явным.

(size + (sizeof(size_t) - 1)) & ~(sizeof(size_t) - 1)

Учитывая, что sizeof(size_t) = 8 и size = 170, что код делает:

(170 + 8) & ~(0x7)

Таким образом, ~(sizeof(size_t) - 1) действует как 3-битовой маски.