Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
1

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

12.03.2012, 14:23. Показов 2010. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
C++
1
2
void *_upointer;
int type:2;
В классе присутствуют 2 переменные. Насколько я знаю, указатель занимает 4 байта, а int в данном случае должен занимать 1.
итого: 5.

когда использовал sizeof, вывело 8. Что не так?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.03.2012, 14:23
Ответы с готовыми решениями:

Неправильное выделение размера массива
Здравствуйте. Столкнулся с непонятной проблемой. У меня есть динамический char массив. Вот он:...

Неправильное выделение памяти в массиве
Прошу помощи в исправлении ошибки памяти. Ошибка: Вызвано исключение: нарушение доступа для...

Неправильное выделение слов с ошибками
Word выделяет слова как ошибочные, хотя проблем в написании нет. И это не похожие на русские...

QAbstractItemModel Неправильное выделение итема
Здравствуйте, собрал из шары некое подобие QAbstractItemModel для QTreeViev. Возникла проблема:...

16
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
12.03.2012, 14:24 2
Ksan, Выравнивание. Или 64 бита и указатель 8 байт. Но скорее выравнивание.
0
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
12.03.2012, 14:26  [ТС] 3
ForEveR, что за выравнивание?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
12.03.2012, 14:36 4
http://en.wikipedia.org/wiki/D... _alignment
0
53 / 53 / 19
Регистрация: 10.03.2012
Сообщений: 138
12.03.2012, 14:37 5
Такова память, что выделяется ячейками. И ровно 5 никак не выделить.
0
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
12.03.2012, 14:40  [ТС] 6
ForEveR,
Duha666,

хм, а я думал, что это только выделение битов округляется в большую сторону, что бы получилось 8*k.
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
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.
0
27 / 27 / 4
Регистрация: 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 байта
};
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
12.03.2012, 14:54 9
Более правильная формулировка тут должна быть такая: "количество бит округляется в большую сторону до CHAR_BIT*k и выделяется не менее k байт".
0
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
12.03.2012, 14:57  [ТС] 10
смысл один и тот же все же
но выделяется-то 8 байт
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
12.03.2012, 15:03 11
Ну так все правильно. 4 байта (я предполагаю, что экспериментируешь ты на x32, так?) выделяются под void *_upointer, и еще 4 - под type. Конечно, под type хватило бы и одного, но разработчикам компилятора было удобнее выделить все 4, благо Стандарт языка дает им такую возможность..... Итого - 8 байт.
0
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
12.03.2012, 15:10  [ТС] 12
проэкспериментировал и вместо int написал __int8. результат тот же
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
12.03.2012, 15:23 13
Ksan, Выравнивание...
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
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;
}
0
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
12.03.2012, 15:32  [ТС] 15
Dev-cpp
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
12.03.2012, 15:36 16
CheshireCat, Ну дык после отключения выравнивания конечно 5 будет...
В новом стандарте есть ключевое слово alignas.
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
12.03.2012, 15:42 17
Dev-cpp - это среда разработки. А, один фиг - за кулисами у нее все тот же GCC+MinGW.....

Короче, правильный ответ про sizeof - минимальный размер структуры на x32 5 байтов, а максимальный - зависит от фантазии разработчиков компилятора....... Каков бы он ни был на самом деле - Стандарту языка это не противоречит.
Тебе зачем-то надо блох ловить и байты считать?
0
12.03.2012, 15:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.03.2012, 15:42
Помогаю со студенческими работами здесь

Неправильное выделение памяти под двумерный массив
Добрый вечер. Пишу код, по численным методам. Алгоритм разобрал, но мучаюсь с выделением памяти под...

Выполнить чтение всех байтов с файла с помощью FileInputStream в массив байтов
Выполнить чтение всех байтов с файла с помощью FileInputStream в массив байтов. Создать строку...

Сканирование байтов в памяти, и получение начального адреса байтов
Привет форумчане! У меня вопрос, как просканировать память у процесса так, чтобы получить адрес...

Если увеличить объём кластера на флешке с 4048 байтов до 8192 байтов то она будет работать быстрей?
Как думаете если увеличить объём кластера на флешке с 4048 байтов до 8192 байтов то на будет...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru