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

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

Войти
Регистрация
Восстановить пароль
 
vampir64
6 / 6 / 0
Регистрация: 01.08.2012
Сообщений: 70
#1

Int как char[5] - это нормально или ужасно? - C++

13.08.2012, 20:14. Просмотров 753. Ответов 14
Метки нет (Все метки)

В целях экономии памяти для размещения данных в структуре решил попробовать провернуть такой трюк:
C++
1
2
3
4
5
6
7
int i = 10241024;
 
char ci[5] = {0};
ci[0] = 0xF; // в 0-ом байте - некоторая служебная информация
*( reinterpret_cast<int*>(ci+1) ) = i;
 
int i2 = *( reinterpret_cast<int*>(ci+1) );
В результате "запакованный" int вместе с дополнительным char можно поместить в структуру с sizeof = 5.
Интересуют мнения специалистов о том, чем плох и чем хорош такой подход.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.08.2012, 20:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Int как char[5] - это нормально или ужасно? (C++):

Как int конвертировать в string или char? - C++
например как сделать это: int x=5; string y=&quot;Hello&quot;+x;

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

Как превести из char* в int и наоборот из int в char*? - C++
Как превести из char* aa='123' в int aa=123 и наоборот из int в char* . Понимаю что самому написать функцию не сложно, но наверняка это...

Есть переменная типа char содержащая цифру; как записать это значение в переменную типа int? - C++
Пожалуйста, напомните стандартную функцию

sting это класс. а int, double и char? - C++
sting это класс. а int, double и char?

Реализация функции char *padl(const char *string, int len, int c=' ') - C++
Реализовать функцию возвращающую указатель на новую строку длины len, полученную из string либо удалением лишних символов слева , либо...

14
cossack5
54 / 48 / 1
Регистрация: 02.08.2012
Сообщений: 127
13.08.2012, 20:18 #2
Не очень-то кроссплатформенно, а так ничего.
1
vampir64
6 / 6 / 0
Регистрация: 01.08.2012
Сообщений: 70
13.08.2012, 20:22  [ТС] #3
А что здесь не так с кроссплатформенностью?
0
cossack5
54 / 48 / 1
Регистрация: 02.08.2012
Сообщений: 127
13.08.2012, 20:30 #4
Цитата Сообщение от vampir64 Посмотреть сообщение
А что здесь не так с кроссплатформенностью?
Могут отличаться размеры char-а и int-a и вообще такое приведение не рекомендуется использовать.
1
vampir64
6 / 6 / 0
Регистрация: 01.08.2012
Сообщений: 70
13.08.2012, 20:38  [ТС] #5
Принято. Вместо char и int использую typedef-ы, тогда в гипотетическом случае другой платформы выбором правильного typedef проблема размера переменных устраняется.
А не рекомендуется почему? Ну, допустим, будет некоторое снижение скорости при обращении с таким псевдоint-ом, ну и ладно.
0
cossack5
54 / 48 / 1
Регистрация: 02.08.2012
Сообщений: 127
13.08.2012, 20:41 #6
Цитата Сообщение от vampir64 Посмотреть сообщение
А не рекомендуется почему? Ну, допустим, будет некоторое снижение скорости при обращении с таким псевдоint-ом, ну и ладно.
http://www.cplusplus.com/forum/general/47849/
1
vampir64
6 / 6 / 0
Регистрация: 01.08.2012
Сообщений: 70
13.08.2012, 20:53  [ТС] #7
Хм... Вроде бы ничего страшного за исключением того, что reinterpret_cast - это ай-ай-ай В общем, буду использовать на свой страх и риск.
0
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
14.08.2012, 15:36 #8
Цитата Сообщение от vampir64 Посмотреть сообщение
Хм... Вроде бы ничего страшного за исключением того, что reinterpret_cast - это ай-ай-ай В общем, буду использовать на свой страх и риск.
На разных платформах размер int может быть разным (потому и не кроссплатформенно). Поэтому, если уж пользуетесь подобными методами, стоит написать некую проверку на sizeof(int).
0
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,790
Записей в блоге: 17
14.08.2012, 16:12 #9
так а где экономия?
0
fasked
Эксперт С++
4942 / 2522 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
14.08.2012, 16:19 #10
Цитата Сообщение от vampir64 Посмотреть сообщение
Вместо char и int использую typedef-ы, тогда в гипотетическом случае другой платформы выбором правильного typedef проблема размера переменных устраняется.
Вы про byte order не забывайте
А если уж очень хочется экономить байты, то вот:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
#pragma pack (push, 1)
struct S1
{
   int a;
   char b;
};
#pragma pack (pop)
 
int main()
{
   std::cout << sizeof(S1) << std::endl;
}
1
vampir64
6 / 6 / 0
Регистрация: 01.08.2012
Сообщений: 70
14.08.2012, 17:10  [ТС] #11
Ага, этот самый байт ордер я уже имел возможность наблюдать Но мне он не вредит. А вот прагм я как-то опасаюсь (кроме #pragma once), но теперь буду знать. Thanks.
0
zss
Модератор
Эксперт С++
6400 / 5966 / 1943
Регистрация: 18.12.2011
Сообщений: 15,357
Завершенные тесты: 1
14.08.2012, 18:01 #12
А не лучше ли для таких целей использовать объединение:
C++
1
2
3
4
5
union S1
{
    char ci[5];
    int i2;
};
1
vampir64
6 / 6 / 0
Регистрация: 01.08.2012
Сообщений: 70
14.08.2012, 18:17  [ТС] #13
Ну в общем-то да, возможно этому варианту найдётся применение.

Добавлено через 8 минут
Цитата Сообщение от Avazart Посмотреть сообщение
так а где экономия?
Ну, скажем, если делать структуру из char и double, она займёт аж 16 байт. А если "нарезать" double байтами, то получится 12 байт (с тремя байтами заглушки после char для выравнивания). Чем не экономия?
0
fasked
Эксперт С++
4942 / 2522 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
14.08.2012, 19:25 #14
Цитата Сообщение от zss Посмотреть сообщение
А не лучше ли для таких целей использовать объединение:
Для таких целей объединения совсем не подходят. Как я понял автору, просто необходимо избавиться от затрат памяти, уходящих на выравнивание.
Цитата Сообщение от vampir64 Посмотреть сообщение
Чем не экономия?
Я надеюсь, что Вы понимаете. Выигрыш в памяти означает проигрыш в скорости.
1
vampir64
6 / 6 / 0
Регистрация: 01.08.2012
Сообщений: 70
14.08.2012, 19:41  [ТС] #15
Всё именно так (хотя union-ом разбивать многобайтовые значения на отдельный байты - как мне кажется, хорошая идея, и этому может найтись применение).
Да, я понимаю, что будет падение производительности как обратная сторона медали.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.08.2012, 19:41
Привет! Вот еще темы с ответами:

Зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может больше 4 байт весить? - C++
Вот еще один вопрос зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может...

Форматирование строк, char to int & int to char - C++
Покажите как запихнуть число в строку и вытащить его обратно из строки. Вот всё просто в pawn str_to_num(const str) // Тупо...

Int в CHAR или LPCSTR (в теле цикла) - C++
Привет, есть цикл: for (int i=0,x=650;i&lt;2;i++,x-=80) { TCHAR BtnText; ...

Определять тип вводимой переменной (char или int) - C++
Вообщем изначально дали задание определять тип вводимой переменной (char или int ). Это я выполнил,затем изменили задание, нужно сделать...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
14.08.2012, 19:41
Ответ Создать тему
Опции темы

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