Форум программистов, компьютерный форум CyberForum.ru

new/malloc align - C++

Восстановить пароль Регистрация
 
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
21.12.2013, 14:45     new/malloc align #1
Обращают ли внимание new/malloc на установленый align для структуры?
Так, например:
C++
1
2
3
4
5
6
7
8
struct __declspec(align(32)) Circle
{
    float x, y;
    float prevX, prevY;
    float speedX, speedY;
    float mass;
    float radius;
};
А если я уберу какую-либо переменную из структуры, то её разер по прежнему будет 32байта из-за выравнивания, ведь так? Но будет ли на это обращать внимание new/malloc? Или же они выделят память под N*28 (было 32б, стало 28б, ибо убрали какое-либо поле)

p.s __declspec(align(32)) -- это вообще по С++ стандарту есть такое или зависит от компилятора, или от IDE?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.12.2013, 14:45     new/malloc align
Посмотрите здесь:

malloc в С++ C++
malloc() C++
C++ malloc vs new
new на malloc C++
C++ new vs malloc
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.12.2013, 14:58     new/malloc align #2
выравнивание одинаково и не зависит от того где расположен объект - в куче или на стеке, один это объект или массив

Добавлено через 4 минуты
Цитата Сообщение от nexen Посмотреть сообщение
__declspec(align(32)) -- это вообще по С++ стандарту есть такое или зависит от компилятора, или от IDE?
это зависит от компилятора, для указания выравнивания ИМХО лучше использовать #pragma push/pop & pack т.к. они точно поддерживаются msvs & mingw.
про __declspec(align(N)) ничего сказать не могу, по-моему это специфически для msvs
Убежденный
Системный программист
 Аватар для Убежденный
14199 / 6214 / 986
Регистрация: 02.05.2013
Сообщений: 10,356
Завершенные тесты: 1
21.12.2013, 15:35     new/malloc align #3
Цитата Сообщение от nexen Посмотреть сообщение
Но будет ли на это обращать внимание new/malloc?
Любопытно, как Вы себе представляете обратное ? Как можно с помощью, например,
"malloc (sizeof (Circle))" получить блок памяти, меньший по размеру, чем "sizeof (Circle)" ?
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
21.12.2013, 15:47  [ТС]     new/malloc align #4
Убежденный, а вдруг магия?
На всякий случай решил убедиться.

Jupiter, кстати, не по теме вопрос, но не знаете, как можно заставить компилятор во время оптимизации не менять местами поля в структуре? Мне нужно получать к ним доступ приведением к типу float* и индексации, но я получаю неверный результат, подозреваю, что из-за оптимизаций.volatile на каждое поле результатов не дал
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,132
Записей в блоге: 26
21.12.2013, 15:59     new/malloc align #5
Цитата Сообщение от nexen Посмотреть сообщение
Обращают ли внимание new/malloc на установленый align для структуры?
Нет. Как правило, new/malloc возвращают адрес памяти, выравненный на максимально выровненный базовый тип (long double). Т.е. даже если ты выделяешь 1 байт памяти, то он будет выровнен на размер long double'а (для intel'а это вроде бы 4 байт, для sparc'а - 16 байт)

Добавлено через 4 минуты
Цитата Сообщение от nexen Посмотреть сообщение
А если я уберу какую-либо переменную из структуры, то её разер по прежнему будет 32байта из-за выравнивания, ведь так?
Даже если ты оставишь в структуре 1 поле типа char, то все переменные такого типа компилятор будет выравнивать в глобальной памяти на 32 байта. Про стек сказать сложнее. В стеке статически нельзя выделить память, выровненную на 32 байта, т.к. стек выровнен на величину, зависящую от конкретного процессора (для intel вроде бы как 4 байта, для sparc - 4 байта в 32-битных режимах, 16 - в 64-битных). Т.е. для размещения такого объекта в стеке нужно в runtime вычислить текущее значение указателя стека, в runtime передвинуть его на величину с требуемым выравниванием

Цитата Сообщение от nexen Посмотреть сообщение
p.s __declspec(align(32)) -- это вообще по С++ стандарту есть такое или зависит от компилятора, или от IDE?
Это НЕ стандартная конструкция, это расширение компиляторов под windows (да и то может не для всех)

Добавлено через 1 минуту
Цитата Сообщение от nexen Посмотреть сообщение
кстати, не по теме вопрос, но не знаете, как можно заставить компилятор во время оптимизации не менять местами поля в структуре?
Компилятор НЕ меняет местами поля структуры. Ибо не имеет на это право. Т.к. распределение полей структуры - это программное соглашение (ABI).
Убежденный
Системный программист
 Аватар для Убежденный
14199 / 6214 / 986
Регистрация: 02.05.2013
Сообщений: 10,356
Завершенные тесты: 1
21.12.2013, 16:01     new/malloc align #6
Цитата Сообщение от nexen Посмотреть сообщение
как можно заставить компилятор во время оптимизации не менять местами поля в структуре?
По стандарту (C++2003, 9.2.12), компилятор обязан сохранять раскладку
членов структуры/класса, объявленных внутри одного спецификатора доступа.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.12.2013, 16:05     new/malloc align #7
Цитата Сообщение от nexen Посмотреть сообщение
Мне нужно получать к ним доступ приведением к типу float* и индексации
union. и не нужно никак приведений кастов.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
21.12.2013, 21:34  [ТС]     new/malloc align #8
Evg, sizeof считается с выравниванием, ведь так? Т.е., если я выравнил 32 байта, он обязан вернуть значение, кратное 32, а значит и new/malloc будут выделять память для этих структур с некоторыми дополнительными пустыми байтами?

Добавлено через 5 часов 0 минут
Есть ли вообще какая-либо разница между структурой размером 24 байта и выравниванием 32 и структурой 32байта с тем же выравниванием, если я не обращаюсь никогда к последним двум элементами?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,132
Записей в блоге: 26
22.12.2013, 01:23     new/malloc align #9
Цитата Сообщение от nexen Посмотреть сообщение
Evg, sizeof считается с выравниванием, ведь так?
Думаю, что нет. Во всяком случае всегда это можно проверить экспериментально, распечатав значение sizeof

Цитата Сообщение от nexen Посмотреть сообщение
а значит и new/malloc будут выделять память для этих структур с некоторыми дополнительными пустыми байтами?
Нет. У malloc'а есть единственный аргумент - размер. Про выравнивание он ничего не знает. А потому возвращает адрес, который гарантированно будет выровнен для любого БАЗОВОГО ТИПА. У new, думаю, всё аналогично

Цитата Сообщение от nexen Посмотреть сообщение
Есть ли вообще какая-либо разница между структурой размером 24 байта и выравниванием 32 и структурой 32байта с тем же выравниванием, если я не обращаюсь никогда к последним двум элементами?
Есть. Переменная типа первая структура занимает на 8 байт меньше, чем переменная типа вторая структура
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
22.12.2013, 01:37     new/malloc align #10
Цитата Сообщение от nexen Посмотреть сообщение
sizeof считается с выравниванием, ведь так?
да.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,132
Записей в блоге: 26
22.12.2013, 01:43     new/malloc align #11
Для такого кода

C
#include <stdio.h>
 
struct s
{
  int x;
} __attribute__((aligned(32)));
 
struct s S;
 
int main()
{
  printf ("%d %d\n", sizeof (S), __alignof__(S));
  return 0;
}
gcc под i386-linux и i386-windows выдаёт "32 32". Т.е. размер должен быть кратен выравниванию. С этой точки зрения структуры размером 24 и выравниванием 32 по сути дела не бывает, компилятор автоматически расширит её sizeof до 32 байт (т.е. в хвост добавит 8 байт неиспользуемого padding'а)

Добавлено через 1 минуту
Т.е. вот это было неправильно:
Цитата Сообщение от Evg Посмотреть сообщение
Есть. Переменная типа первая структура занимает на 8 байт меньше, чем переменная типа вторая структура
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
22.12.2013, 08:01  [ТС]     new/malloc align #12
Цитата Сообщение от Evg Посмотреть сообщение
А потому возвращает адрес, который гарантированно будет выровнен для любого БАЗОВОГО ТИПА. У new, думаю, всё аналогично
Но как же тогда выделить память с выравниванием?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,132
Записей в блоге: 26
22.12.2013, 11:19     new/malloc align #13
Цитата Сообщение от nexen Посмотреть сообщение
Но как же тогда выделить память с выравниванием?
Если тебе нужен участок памяти размером в 32 байта, выровненный на 32, то выделаешь malloc'ом 64 байта, а потом внутри этой памяти ищешь адрес, который кратен 32. В общем виде: если тебе нужно выделить память под N элементов, размером SIZE и выравниванием ALIGN, то выделаешь память размером в "N*SIZE + ALIGN" байт и ищешь в ней участок, выровненный на ALIGN
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
22.12.2013, 11:23  [ТС]     new/malloc align #14
Evg, вот это хак, вот это магия О_о
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,132
Записей в блоге: 26
22.12.2013, 11:30     new/malloc align #15
Цитата Сообщение от nexen Посмотреть сообщение
Evg, вот это хак, вот это магия О_о
Вообще-то это стандартный способ. Либо пиши свой менеджер памяти, который сразу выделает себе большой шматок памяти, а дальше уже отдаёт в точку вызова с учётом выравнивания
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
22.12.2013, 12:01  [ТС]     new/malloc align #16
Evg, я просто не знал о подобном способе (хотя можно было бы и догадаться), поэтому для меня это выглядит.. ух.. очень интересным решением в общем
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2013, 13:20     new/malloc align
Еще ссылки по теме:

new, malloc, C++
Malloc realloc и C++ C++
C++ Malloc vs new

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Убежденный
Системный программист
 Аватар для Убежденный
14199 / 6214 / 986
Регистрация: 02.05.2013
Сообщений: 10,356
Завершенные тесты: 1
22.12.2013, 13:20     new/malloc align #17
В Visual C++ есть функция _aligned_malloc:
http://msdn.microsoft.com/en-us/library/8z34s9c6.aspx
Yandex
Объявления
22.12.2013, 13:20     new/malloc align
Ответ Создать тему
Опции темы

Текущее время: 00:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru