Таинственные 8 байт
|
|
Batist | Дата: Суббота, 15 Февраля 2014, 22:27 | Сообщение # 1 |
участник
Сейчас нет на сайте
| Доброго времени суток. Понятия не имею, где поинтересоваться по этому поводу, так что спрошу здесь. Я пишу в Visual Studio 2010 (C++). В результате экспериментов с памятью заметил, что между всеми переменными, объявленными в программе, всегда есть 8 байт. Это касается как стандартных типов данных, так и абстрактных (структуры, классы и т.д.). При чём эти 8 байт всегда пусты. Гуглил насчёт этого, но ничего не обнаружил (допускаю, что гуглил плохо). Возможно кто-то уже интересовался этим вопросом и знает, для чего компилятор оставляет такие большие дыры?
|
|
| |
Lightsoft | Дата: Суббота, 15 Февраля 2014, 22:49 | Сообщение # 2 |
частый гость
Сейчас нет на сайте
| Компилятор делает выравнивание, чтобы можно было быстрее обращаться к адресам в памяти процессору.
Сообщение отредактировал Lightsoft - Суббота, 15 Февраля 2014, 22:52 |
|
| |
Sanoraag | Дата: Воскресенье, 16 Февраля 2014, 11:10 | Сообщение # 3 |
почетный гость
Сейчас нет на сайте
| как сказал Lightsoft, это действительно так, но компилятор ,скажем так, еще оставляет запас места (хотя бы для операции new). Это нормально, но если умеешь управлять памятью то попробуй поиграть с памятью что бы такого не было
|
|
| |
OpenGOO | Дата: Воскресенье, 16 Февраля 2014, 11:21 | Сообщение # 4 |
почти ветеран
Сейчас нет на сайте
| Цитата Sanoraag ( ) компилятор ,скажем так, еще оставляет запас места (хотя бы для операции new)
Это ты сам придумал?)
Мои проекты: - Свободный и открытый клон World Of Goo - TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)
[GameMaker: Studio v1.4.9999]
|
|
| |
Sanoraag | Дата: Воскресенье, 16 Февраля 2014, 14:20 | Сообщение # 5 |
почетный гость
Сейчас нет на сайте
| нет. Я смотрел об управлении памятью на ютубе, где человек так выразился
|
|
| |
Snake174 | Дата: Понедельник, 17 Февраля 2014, 09:41 | Сообщение # 6 |
участник
Сейчас нет на сайте
| setpack1.h Код #if defined(_MSC_VER) #pragma warning( disable : 4103 ) #endif
#if defined(__BORLANDC__) #pragma warning(push) #if (__BORLANDC__ > 0x0520) #pragma warn -8059 #else #pragma warn -pck #endif #endif
#if defined (__IBMCPP__) #pragma pack(1) #endif
#if defined(_MSC_VER) || defined(__GNUC__) || defined(__BORLANDC__) #pragma pack(push,1) #endif
pop_pack.h Код #if defined(_MSC_VER) || defined(__GNUC__) || defined(__BORLANDC__) || defined (__IBMCPP__) #pragma pack(pop) #endif
#if defined(__BORLANDC__) #pragma warning(pop) #endif
Пример Код #include "setpack1.h" struct A { int a; float b; double c; }; #include "pop_pack.h"
И будет нормальное выравнивание.
Не следует обманывать инспектора Pipmak Assistant Love2D Exporter Love2D-Helpers Old Consoles Games
Сообщение отредактировал Snake174 - Понедельник, 17 Февраля 2014, 09:43 |
|
| |
OpenGOO | Дата: Понедельник, 17 Февраля 2014, 11:05 | Сообщение # 7 |
почти ветеран
Сейчас нет на сайте
| Для 32 битных процессоров нормальное выравнивание для int и float это 4, для double 8, а не как не 1, 1 только для char. Структуры вообще не рекомендуют выравнивать, чтобы не убить производительность.
Мои проекты: - Свободный и открытый клон World Of Goo - TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)
[GameMaker: Studio v1.4.9999]
|
|
| |
Snake174 | Дата: Понедельник, 17 Февраля 2014, 11:20 | Сообщение # 8 |
участник
Сейчас нет на сайте
| Цитата Для 32 битных процессоров нормальное выравнивание для int и float это 4, для double 8, а не как не 1, 1 только для char. Это ты к чему? Я нигде не утверждал, что для int и float и т.д. выравнивание 1 будет. И никого не заставляю пользоваться выравниванием, просто показал пример.
Не следует обманывать инспектора Pipmak Assistant Love2D Exporter Love2D-Helpers Old Consoles Games
|
|
| |
OpenGOO | Дата: Понедельник, 17 Февраля 2014, 11:32 | Сообщение # 9 |
почти ветеран
Сейчас нет на сайте
| Я просто дополнил пример своим комментарием, а то кто не в теме, может не правильно понять что значит нормальное выравнивание.
Мои проекты: - Свободный и открытый клон World Of Goo - TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)
[GameMaker: Studio v1.4.9999]
|
|
| |
Batist | Дата: Понедельник, 17 Февраля 2014, 14:17 | Сообщение # 10 |
участник
Сейчас нет на сайте
| Всем спасибо за ответы, но я всё же ничего не понял. Я знаю про выравнивание до 4 байт и оно мне вроде как понятно. Но я спрашиваю про расстояние между переменными. То есть, если объявить две переменные типа char, то разница между адресами этих переменных будет 12 байт: 4 байта на саму переменную (то самое выравнивание) и ещё 8 байт до следующей переменной. Или это часть выравнивания? Но ведь все переменные и так выравнены по 4 байт, какой смысл между ними оставлять такие дыры? Плюс эти 8 байт пусты и в них спокойно можно занести свои данные, то есть компилятор никак их не "защищает", и напрашивается вывод, что они ни под что и не отведены (наверное глупая логика, но всё же). По поводу операции new я проверял, 8 байт вроде как остаются.
|
|
| |
JunkerKun | Дата: Пятница, 14 Марта 2014, 23:40 | Сообщение # 11 |
частый гость
Сейчас нет на сайте
| Насколько я мог понять, все происходит по следующему сценарию:
1) В памяти объявляется переменная. Допустим, это char, ее размер 1 байт. 2) Делается выравнивание - добавляется 3 байта, чтобы в сумме "блок" был размером 4 байта. 3) Если после этого объявляется переменная размером меньше 3 байта (short), то после нее не будет добавлено никаких пустых байтов и в итоге будет всего 1 пустой байт. 4) Опять же, если мы теперь объявим char, то все байты будут ненулевыми - char, short, char. 5) Все начинается снова.
Соответственно они не "неотведены", они просто ждут своего использования.
Поправьте, если я неправ.
|
|
| |
Akyltist | Дата: Четверг, 24 Апреля 2014, 09:11 | Сообщение # 12 |
заслуженный участник
Сейчас нет на сайте
| Цитата Batist ( ) Я знаю про выравнивание до 4 байт align 4 align 8 align 16 align 32 - в качестве примеров... должны понять смысл. Цитата Lightsoft ( ) Компилятор делает выравнивание, чтобы можно было быстрее обращаться к адресам в памяти процессору. вот вам ответ для чего это делается.
Цитата OpenGOO ( ) Структуры вообще не рекомендуют выравнивать, чтобы не убить производительность. начало структуры как бы наоборот желательно выравнивать по align 4, то что в конце забьется 0 для выравнивания не страшно. Главное порядок определения внутри структур правильный делать. Но в современных реалиях люди уже давно не заморачиваются. (
|
|
| |