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

Неправильное выделение байтов - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
12.03.2012, 14:23     Неправильное выделение байтов #1
C++
1
2
void *_upointer;
int type:2;
В классе присутствуют 2 переменные. Насколько я знаю, указатель занимает 4 байта, а int в данном случае должен занимать 1.
итого: 5.

когда использовал sizeof, вывело 8. Что не так?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.03.2012, 14:23     Неправильное выделение байтов
Посмотрите здесь:

Сумма байтов C++
порядок байтов C++
C++ this возвращает неправильное значение
C++ Неправильное время сортировок
C++ Неправильное считывание данных
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
12.03.2012, 14:24     Неправильное выделение байтов #2
Ksan, Выравнивание. Или 64 бита и указатель 8 байт. Но скорее выравнивание.
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
12.03.2012, 14:26  [ТС]     Неправильное выделение байтов #3
ForEveR, что за выравнивание?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
12.03.2012, 14:36     Неправильное выделение байтов #4
http://en.wikipedia.org/wiki/Data_structure_alignment
Duha666
50 / 50 / 5
Регистрация: 10.03.2012
Сообщений: 138
12.03.2012, 14:37     Неправильное выделение байтов #5
Такова память, что выделяется ячейками. И ровно 5 никак не выделить.
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
12.03.2012, 14:40  [ТС]     Неправильное выделение байтов #6
ForEveR,
Duha666,

хм, а я думал, что это только выделение битов округляется в большую сторону, что бы получилось 8*k.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
12.03.2012, 14:44     Неправильное выделение байтов #7
И кстати, почему ты решил, что представление битового поля должно занимать 1 байт?

Стандарт языка считает иначе:
The value of the integral constant expression may be larger than the number of bits in the object
representation (3.9) of the bit-field’s type; in such cases the extra bits are used as padding bits and do not
participate in the value representation (3.9) of the bit-field. Allocation of bit-fields within a class object is
implementation-defined. Alignment of bit-fields is implementation-defined.
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
12.03.2012, 14:48  [ТС]     Неправильное выделение байтов #8
CheshireCat, я где-то читал, что в битовых полях количество бит округляется в большую сторону до 8*k и выделяется k байт. Ну пример:

C++
1
2
3
4
5
6
7
8
9
10
struct uuu
{
  int i:2, j:2, k:2; // выделится 1 байт на всю структуру
};
 
или
 
struct iii {
  int i:9, j:8, k:8; // выделится 4 байта
};
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
12.03.2012, 14:54     Неправильное выделение байтов #9
Более правильная формулировка тут должна быть такая: "количество бит округляется в большую сторону до CHAR_BIT*k и выделяется не менее k байт".
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
12.03.2012, 14:57  [ТС]     Неправильное выделение байтов #10
смысл один и тот же все же
но выделяется-то 8 байт
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
12.03.2012, 15:03     Неправильное выделение байтов #11
Ну так все правильно. 4 байта (я предполагаю, что экспериментируешь ты на x32, так?) выделяются под void *_upointer, и еще 4 - под type. Конечно, под type хватило бы и одного, но разработчикам компилятора было удобнее выделить все 4, благо Стандарт языка дает им такую возможность..... Итого - 8 байт.
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
12.03.2012, 15:10  [ТС]     Неправильное выделение байтов #12
проэкспериментировал и вместо int написал __int8. результат тот же
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
12.03.2012, 15:23     Неправильное выделение байтов #13
Ksan, Выравнивание...
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
12.03.2012, 15:28     Неправильное выделение байтов #14
Компилер какой? GCC 4.7:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
 
#pragma pack(1)
struct Test
{
    void *_upointer;
    __int8 type:2;
};
 
int main()
{
    cout << sizeof(Test) << endl;   // вывод: 5
    return 0;
}
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
12.03.2012, 15:32  [ТС]     Неправильное выделение байтов #15
Dev-cpp
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
12.03.2012, 15:36     Неправильное выделение байтов #16
CheshireCat, Ну дык после отключения выравнивания конечно 5 будет...
В новом стандарте есть ключевое слово alignas.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.03.2012, 15:42     Неправильное выделение байтов
Еще ссылки по теме:

Порядок байтов C++
C++ Неправильное перевыделение
C++ Неправильное вычисление ярдов

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

Или воспользуйтесь поиском по форуму:
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
12.03.2012, 15:42     Неправильное выделение байтов #17
Dev-cpp - это среда разработки. А, один фиг - за кулисами у нее все тот же GCC+MinGW.....

Короче, правильный ответ про sizeof - минимальный размер структуры на x32 5 байтов, а максимальный - зависит от фантазии разработчиков компилятора....... Каков бы он ни был на самом деле - Стандарту языка это не противоречит.
Тебе зачем-то надо блох ловить и байты считать?
Yandex
Объявления
12.03.2012, 15:42     Неправильное выделение байтов
Ответ Создать тему
Опции темы

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