Пятница, 29 Марта 2024, 18:07

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » C/C++ » Таинственные 8 байт (Расстояние между переменными)
Таинственные 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 для выравнивания не страшно. Главное порядок определения внутри структур правильный делать. Но в современных реалиях люди уже давно не заморачиваются. (
Форум игроделов » Программирование » C/C++ » Таинственные 8 байт (Расстояние между переменными)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг