Код: Выделить всё
struct {
char a;
short b;
int c;
long long d;
double e;
void* p;
}существует ли правило для минимизации памяти, например размещать элементы в структуре по возрастанию размера, или по убыванию.
Модератор: Модераторы разделов
Код: Выделить всё
struct {
char a;
short b;
int c;
long long d;
double e;
void* p;
}Код: Выделить всё
long long d;
double e;существует ли правило для минимизации памяти, например размещать элементы в структуре по возрастанию размера, или по убыванию.
Код: Выделить всё
struct MyStruct
{
Byte Ident;
Byte Date[3];
Byte Time[3];
long Value;
Byte Checksum;
};
FILE* InFile;
InFile = fopen (InFileName, "rb");
long InFileLength = filelength (InFile); // функция для определения размера файла
if ( InFileLength%sizeof (MyStruct) !=0) // проверка кратности размера файла размеру одной записи.
{return -1; }
long EntriesNum = InFileLength/sizeof (MyStruct);
MyStruct* Buff = new MyStruct [EntriesNum]; // создаём массив структур
fread ((Byte*)(Buff),sizeof (MyStruct), EntriesNum, InFile ); // читаем файл в память
fclose (InFile)
/*здесь делаем какие-то действия*/
delete[] Buff;Код: Выделить всё
#pragma pack(push, 1)
struct MyStruct
{
double dbl;
int i;
long long lng;
};
#pragma pack(pop)RasenHerz писал(а): ↑18.05.2008 12:58хм... довольно таки интересная ситуация. я могу лишь набросать примерную схему работы.
почему бы не воспольщоваться , к примеру, таблицей со значениями смещений полей стуктуры? можно будет сначала передать клиенту размер таблицы, следом в виде массива байт передать саму таблицу, передать массив байт соответствующих структуре. клиенту необходимо сваять функцию, которая свяжет таблицу и переданный массив и вернет результат в виде структуры. если такое решение вас вполне устроит, то я могу набросать его примерную реализацию.
Electronix писал(а): ↑18.05.2008 13:23Rmic
В обоих приложениях принудительно устанавливать смещение для структур, с помощью дириктивы #pragma pack, например. Выше в постах упоминается еще attribute(packed) - я подозреваю что это тоже самое практически, но я об это ничего не знаю, т.к. научился это делать через #pragma и когда учился никто мне о attribute packed ничего не говорил.
Код: Выделить всё
#pragma pack(push, 1) struct MyStruct { double dbl; int i; long long lng; }; #pragma pack(pop)
Rmic писал(а): ↑18.05.2008 13:57Так конечно можно, но мне такой подход видится не совсем целесообразным, поскольку при разработке клиент-серверных приложений часто имеется задача реализации конкретных протоколов, а не разработки новых. К тому же, имхо, нелогично привязывать протокол к внутренним особенностям работы компилятора или компьютера.