Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.07.2017, 15:59   #1
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию Выравнивание целых чисел по заданной границе

Мне понадобилось выравнивать целые числа по заданной границе, и я обратился к доисторическим макросам Криса Касперски:

Код:
template <typename TInt>
TInt ALIGN_DOWN(TInt x, TInt align)
{
	return (x & ~(align - 1));
}

template <typename TInt>
TInt ALIGN_UP(TInt x, TInt align)
{
	return (x & (align - 1)) ? ALIGN_DOWN(x, align) + align : x;
}
Выравнивание вверх мне показалось слишком громоздким, и я отправился читать Hacker's Delight, где выравнивание делается гораздо короче:

Код:
template <typename TInt>
TInt ALIGN_UP2(TInt x, TInt align)
{
	return (x + (align - 1)) & -align;
}
Протестировал оба варианта. Вроде, работают. Какой из них предпочесть? Есть ли недостатки у второго?

И еще: как назвать аргумент типа шаблона, если работать буду с целыми числами и указателями?
Aoizora вне форума Ответить с цитированием
Старый 11.07.2017, 21:29   #2
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Ну а теперь скомпильте с типом size_t скажем.
Подозреваю, как минимум варнинги.
alexzk вне форума Ответить с цитированием
Старый 11.07.2017, 21:48   #3
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
Ну а теперь скомпильте с типом size_t скажем.
Подозреваю, как минимум варнинги.
Хм, в самом деле. Надо добавить еще один параметр типа шаблона.

Код:
	std::size_t x = 17;
	std::cout << ALIGN_UP2(x, (unsigned)16) << std::endl;
Код:
template <typename TInt, typename TAlign = std::size_t>
TInt ALIGN_UP2(TInt x, TAlign align)
{
	return (x + (align - 1)) & -align;
}

Последний раз редактировалось Aoizora; 11.07.2017 в 21:50.
Aoizora вне форума Ответить с цитированием
Старый 11.07.2017, 22:44   #4
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

-align;

меня вот это смущает, тип-то unsigned. Будет чепуха какаят-то.
У криса этого нет именно поэтому.
alexzk вне форума Ответить с цитированием
Старый 11.07.2017, 23:24   #5
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
-align;

меня вот это смущает, тип-то unsigned. Будет чепуха какаят-то.
У криса этого нет именно поэтому.
Да нормально выравнивает, когда оба аргумента std::size_t. Только надо прописать #pragma warning ( disable : 4146 ), чтобы ворнинг не трактовался как ошибка.
Aoizora вне форума Ответить с цитированием
Старый 11.07.2017, 23:39   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

http://en.cppreference.com/w/c/memory/aligned_alloc
waleri вне форума Ответить с цитированием
Старый 12.07.2017, 18:37   #7
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 734
По умолчанию

Не подскажете, что такое выравнивание и зачем оно нужно? Скажите, пожалуйста. Типа выравнивание, кратное какому-то адресу что-ли?
Напишу программу на C++ и Asm для AVR. Черчение: sergeisky@yahoo.com.

Последний раз редактировалось Cuprum5; 12.07.2017 в 19:03.
Cuprum5 вне форума Ответить с цитированием
Старый 12.07.2017, 19:20   #8
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию

Цитата:
Сообщение от Cuprum5 Посмотреть сообщение
Не подскажете, что такое выравнивание и зачем оно нужно? Скажите, пожалуйста. Типа выравнивание, кратное какому-то адресу что-ли?
Округление вверх или вниз до ближайшего значения, кратного заданному числу align. Используется в системном программировании, когда какие-то данные (например, секции PE-файла) выравниваются по заданной границе.
Aoizora вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дана непустая последовательность целых чисел. Найти: Сумму чисел, больших числа x и количество всех чётных чисел maksim97maksim Паскаль, Turbo Pascal, PascalABC.NET 1 09.04.2014 13:59
Даны два целых числа A и B (A < B). Найти произведение всех целых чисел от A до B включительно. nadyaH Помощь студентам 10 29.10.2013 09:08
Выравнивание по заданной позиции Artur-07 C# (си шарп) 0 17.06.2012 18:11
Дана последовательность вещественных чисел. каждая пара чисел задает границы отрезка. Найти количество целых чисел на отрезках 'studentka' Помощь студентам 6 30.11.2011 18:35
Выравнивание по левой крайней границе sasha0123 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 15.01.2011 13:15