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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
#1

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

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

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

когда использовал sizeof, вывело 8. Что не так?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.03.2012, 14:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Неправильное выделение байтов (C++):

Неправильное перевыделение - C++
Собственно помогите правильно перевыделить память под массив. #include <stdio.h> #include <iostream> #include <stdlib.h> #include...

Сумма байтов - C++
Всем доброго времени суток. Помогите пожалуйста. У меня задание: вычислить контрольную сумму последовательности байтов, ограниченной двумя...

Порядок байтов - C++
Заранее извиняюсь если не туда пишу... Помогите определить порядок байтов: 01 00 00 00 71 82 3D 00 CB 82 3D 00 ED 68 4C 23...

Перестановка байтов - C++
Задание: Определить объединение из двух полей. Первое поле - массив из 4 байт, второе двойное слово. Ввести случайное целое число в...

Чтение байтов - C++
Ребят, здравствуйте , nомогите разобраться , есть бинарный файл , в нем данные заnисанные в структурах , и в файле 1-е 4 байта это кол-во...

порядок байтов - C++
Подскажите, пожалуйста, как записать целое число в битовый файл, чтобы на всех машинах оно считывалось бы с одинаковым порядком байт.

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

хм, а я думал, что это только выделение битов округляется в большую сторону, что бы получилось 8*k.
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
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
Ksan
27 / 27 / 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 байта
};
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
12.03.2012, 14:54 #9
Более правильная формулировка тут должна быть такая: "количество бит округляется в большую сторону до CHAR_BIT*k и выделяется не менее k байт".
0
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
12.03.2012, 14:57  [ТС] #10
смысл один и тот же все же
но выделяется-то 8 байт
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
12.03.2012, 15:03 #11
Ну так все правильно. 4 байта (я предполагаю, что экспериментируешь ты на x32, так?) выделяются под void *_upointer, и еще 4 - под type. Конечно, под type хватило бы и одного, но разработчикам компилятора было удобнее выделить все 4, благо Стандарт языка дает им такую возможность..... Итого - 8 байт.
0
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
12.03.2012, 15:10  [ТС] #12
проэкспериментировал и вместо int написал __int8. результат тот же
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
12.03.2012, 15:23 #13
Ksan, Выравнивание...
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
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
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
12.03.2012, 15:32  [ТС] #15
Dev-cpp
0
12.03.2012, 15:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.03.2012, 15:32
Привет! Вот еще темы с ответами:

this возвращает неправильное значение - C++
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; class oops{ public: oops():key(10){} int key; oops&amp; oper1(int...

Неправильное чтение из файла - C++
Имеется файл, в нем записано что-то вроде {1 2 3}{2 1 3}{3 1 2} Моя задача считать все цифры, за исключением первой внутри {} и...

Неправильное использование memset - C++
сам столкнулся как-то с такой вещью как неправильное использование memset на чистом си... до этого пользовался им только для обнуления, но...

Неправильное время сортировок - C++
Уважаемые знатоки, у меня такая проблема..даже две) Я пишу программу, которая генерирует массив, сортирует его тремя способами (метод...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru