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

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

Восстановить пароль Регистрация
 
vampir64
6 / 6 / 0
Регистрация: 01.08.2012
Сообщений: 70
13.08.2012, 20:14     Int как char[5] - это нормально или ужасно? #1
В целях экономии памяти для размещения данных в структуре решил попробовать провернуть такой трюк:
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.
Интересуют мнения специалистов о том, чем плох и чем хорош такой подход.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
cossack5
54 / 48 / 1
Регистрация: 02.08.2012
Сообщений: 127
13.08.2012, 20:18     Int как char[5] - это нормально или ужасно? #2
Не очень-то кроссплатформенно, а так ничего.
vampir64
6 / 6 / 0
Регистрация: 01.08.2012
Сообщений: 70
13.08.2012, 20:22  [ТС]     Int как char[5] - это нормально или ужасно? #3
А что здесь не так с кроссплатформенностью?
cossack5
54 / 48 / 1
Регистрация: 02.08.2012
Сообщений: 127
13.08.2012, 20:30     Int как char[5] - это нормально или ужасно? #4
Цитата Сообщение от vampir64 Посмотреть сообщение
А что здесь не так с кроссплатформенностью?
Могут отличаться размеры char-а и int-a и вообще такое приведение не рекомендуется использовать.
vampir64
6 / 6 / 0
Регистрация: 01.08.2012
Сообщений: 70
13.08.2012, 20:38  [ТС]     Int как char[5] - это нормально или ужасно? #5
Принято. Вместо char и int использую typedef-ы, тогда в гипотетическом случае другой платформы выбором правильного typedef проблема размера переменных устраняется.
А не рекомендуется почему? Ну, допустим, будет некоторое снижение скорости при обращении с таким псевдоint-ом, ну и ладно.
cossack5
54 / 48 / 1
Регистрация: 02.08.2012
Сообщений: 127
13.08.2012, 20:41     Int как char[5] - это нормально или ужасно? #6
Цитата Сообщение от vampir64 Посмотреть сообщение
А не рекомендуется почему? Ну, допустим, будет некоторое снижение скорости при обращении с таким псевдоint-ом, ну и ладно.
http://www.cplusplus.com/forum/general/47849/
vampir64
6 / 6 / 0
Регистрация: 01.08.2012
Сообщений: 70
13.08.2012, 20:53  [ТС]     Int как char[5] - это нормально или ужасно? #7
Хм... Вроде бы ничего страшного за исключением того, что reinterpret_cast - это ай-ай-ай В общем, буду использовать на свой страх и риск.
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
14.08.2012, 15:36     Int как char[5] - это нормально или ужасно? #8
Цитата Сообщение от vampir64 Посмотреть сообщение
Хм... Вроде бы ничего страшного за исключением того, что reinterpret_cast - это ай-ай-ай В общем, буду использовать на свой страх и риск.
На разных платформах размер int может быть разным (потому и не кроссплатформенно). Поэтому, если уж пользуетесь подобными методами, стоит написать некую проверку на sizeof(int).
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,584
Записей в блоге: 17
14.08.2012, 16:12     Int как char[5] - это нормально или ужасно? #9
так а где экономия?
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
14.08.2012, 16:19     Int как char[5] - это нормально или ужасно? #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;
}
vampir64
6 / 6 / 0
Регистрация: 01.08.2012
Сообщений: 70
14.08.2012, 17:10  [ТС]     Int как char[5] - это нормально или ужасно? #11
Ага, этот самый байт ордер я уже имел возможность наблюдать Но мне он не вредит. А вот прагм я как-то опасаюсь (кроме #pragma once), но теперь буду знать. Thanks.
zss
Модератор
Эксперт С++
 Аватар для zss
5943 / 5548 / 1783
Регистрация: 18.12.2011
Сообщений: 14,167
Завершенные тесты: 1
14.08.2012, 18:01     Int как char[5] - это нормально или ужасно? #12
А не лучше ли для таких целей использовать объединение:
C++
1
2
3
4
5
union S1
{
    char ci[5];
    int i2;
};
vampir64
6 / 6 / 0
Регистрация: 01.08.2012
Сообщений: 70
14.08.2012, 18:17  [ТС]     Int как char[5] - это нормально или ужасно? #13
Ну в общем-то да, возможно этому варианту найдётся применение.

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

C++ Определять тип вводимой переменной (char или int)
C++ Как в выделенную память записать поочередно число int, массив char[n], и еще число int
C++ Int в CHAR или LPCSTR (в теле цикла)

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

Или воспользуйтесь поиском по форуму:
vampir64
6 / 6 / 0
Регистрация: 01.08.2012
Сообщений: 70
14.08.2012, 19:41  [ТС]     Int как char[5] - это нормально или ужасно? #15
Всё именно так (хотя union-ом разбивать многобайтовые значения на отдельный байты - как мне кажется, хорошая идея, и этому может найтись применение).
Да, я понимаю, что будет падение производительности как обратная сторона медали.
Yandex
Объявления
14.08.2012, 19:41     Int как char[5] - это нормально или ужасно?
Ответ Создать тему
Опции темы

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