struct a
{
char *c;
char b;
};
What is sizeof(a)?
GEOCHET
21.1k15 gold badges73 silver badges98 bronze badges
asked Sep 27, 2008 at 4:58
1
#include <stdio.h>
typedef struct { char* c; char b; } a;
int main()
{
printf("sizeof(a) == %d", sizeof(a));
}
I get «sizeof(a) == 8», on a 32-bit machine. The total size of the structure will depend on the packing: In my case, the default packing is 4, so ‘c’ takes 4 bytes, ‘b’ takes one byte, leaving 3 padding bytes to bring it to the next multiple of 4: 8. If you want to alter this packing, most compilers have a way to alter it, for example, on MSVC:
#pragma pack(1)
typedef struct { char* c; char b; } a;
gives sizeof(a) == 5. If you do this, be careful to reset the packing before any library headers!
answered Sep 27, 2008 at 5:13
Simon BuchanSimon Buchan
12.6k2 gold badges48 silver badges55 bronze badges
4
Contrary to what some of the other answers have said, on most systems, in the absence of a pragma or compiler option, the size of the structure will be at least 6 bytes and, on most 32-bit systems, 8 bytes. For 64-bit systems, the size could easily be 16 bytes. Alignment does come into play; always. The sizeof a single struct has to be such that an array of those sizes can be allocated and the individual members of the array are sufficiently aligned for the processor in question. Consequently, if the size of the struct was 5 as others have hypothesized, then an array of two such structures would be 10 bytes long, and the char pointer in the second array member would be aligned on an odd byte, which would (on most processors) cause a major bottleneck in the performance.
answered Sep 27, 2008 at 5:10
Jonathan LefflerJonathan Leffler
726k140 gold badges899 silver badges1275 bronze badges
2
If you want to manually count it, the size of a struct is just the size of each of its data members after accounting for alignment. There’s no magic overhead bytes for a struct.
answered Sep 27, 2008 at 5:21
Jeff HubbardJeff Hubbard
9,7823 gold badges30 silver badges28 bronze badges
The exact value is sizeof(a).
You might also take a risk and assume that it is in this case no less than 2 and no greater than 16.
answered Sep 27, 2008 at 5:09
eugenskeugensk
1,8621 gold badge14 silver badges20 bronze badges
1
This will vary depending on your architecture and how it treats basic data types. It will also depend on whether the system requires natural alignment.
answered Sep 27, 2008 at 5:04
mdecmdec
5,0624 gold badges25 silver badges26 bronze badges
I assume you mean struct and not strict, but on a 32-bit system it’ll be either 5 or 8 bytes, depending on if the compiler is padding the struct.
answered Sep 27, 2008 at 5:00
Serafina BrociousSerafina Brocious
30.4k12 gold badges89 silver badges114 bronze badges
I suspect you mean ‘struct’, not ‘strict’, and ‘char’ instead of ‘Char’.
The size will be implementation dependent. On most 32-bit systems, it will probably be 5 — 4 bytes for the pointer, one for the char. I don’t believe alignment will come into play here. If you swapped ‘c’ and ‘b’, however, the size may grow to 8 bytes.
Ok, I tried it out (g++ 4.2.3, with -g option) and I get 8.
answered Sep 27, 2008 at 5:02
Fred LarsonFred Larson
60.7k16 gold badges112 silver badges174 bronze badges
1
The sizeof the structure should be 8 bytes on a 32 bit system, so that the size of the structure becomes multiple of 2. This makes individual structures available at the correct byte boundaries when an array of structures is declared. This is achieved by padding the structure with 3 bytes at the end.
If the structure had the pointer declared after the char, it would still be 8 bytes in size
but the 3 byte padding would have been added to keep the pointer (which is a 4 byte element) aligned at a 4 byte address boundary.
The rule of thumb is that elements should be at an offset which is the multiple of their byte size and the structure itself should be of a size which is a multiple of 2.
answered Sep 27, 2008 at 5:17
computinglifecomputinglife
4,3111 gold badge21 silver badges17 bronze badges
1
I was asked this as interview question. Couldn’t answer.
Write a C program to find size of structure without using the
sizeof
operator.
Jacob Schoen
14k15 gold badges80 silver badges102 bronze badges
asked Sep 12, 2011 at 3:36
6
struct XYZ{
int x;
float y;
char z;
};
int main(){
struct XYZ arr[2];
int sz = (char*)&arr[1] - (char*)&arr[0];
printf("%d",sz);
return 0;
}
answered Sep 12, 2011 at 3:46
Benjamin LindleyBenjamin Lindley
101k9 gold badges199 silver badges272 bronze badges
3
Here’s another approach. It also isn’t completely defined but will still work on most systems.
typedef struct{
// stuff
} mystruct;
int main(){
mystruct x;
mystruct *p = &x;
int size = (char*)(p + 1) - (char*)p;
printf("Size = %dn",size);
return 0;
}
answered Sep 12, 2011 at 3:46
MysticialMysticial
463k45 gold badges334 silver badges332 bronze badges
9
Here’s two macro versions for the two forms of sizeof
(takes a type vs. takes a variable) that you can use for all the code you’ll never write where you aren’t allowed to use sizeof
:
#define type_sizeof(t) (size_t)((char *)((t *)1024 + 1) - (char *)((t *)1024))
#define var_sizeof(v) (size_t)((char *)(&(v) + 1) - (char *)&(v))
Perhaps with some deep magic you can combine the two into a single macro that will almost serve as a drop-in replacement in all this sizeof
-less code. (Too bad you can’t fix the multiple-evaluation bugs.)
answered Sep 12, 2011 at 3:59
Chris LutzChris Lutz
72.9k16 gold badges128 silver badges182 bronze badges
Here is another approach…. no need to create any instance of structure.
struct XYZ{
int x;
float y;
char z;
};
int main(){
int sz = (int) (((struct XYZ *)0) + 1);
printf("%d",sz);
return 0;
}
How does it work?
((struct XYZ *)0) + 1 = zero + size of structure
= size of structure
answered May 31, 2012 at 6:59
Ravi GuptaRavi Gupta
6,25816 gold badges55 silver badges79 bronze badges
1
For people that like C macro style coding, here is my take on this:
#define SIZE_OF_STRUCT(mystruct)
({ struct nested_##mystruct {
struct mystruct s;
char end[0];
} __attribute__((packed)) var;
var.end - (char *)&var; })
void main()
{
struct mystruct {
int c;
};
printf("size %dn", SIZE_OF_STRUCT(mystruct));
}
answered Sep 15, 2011 at 6:15
struct ABC
{
int a, b[3];
int c;
float d;
char e, f[2];
};
int main()
{
struct ABC *ptr=(struct ABC *)0;
clrscr();
ptr++;
printf("Size of structure is: %d",ptr);
return 0;
}
answered Apr 8, 2015 at 8:32
struct ABC
{
int a;
float b;
char c;
};
void main()
{
struct ABC *ptr=(struct ABC *)0;
ptr++;
printf("Size of structure is: %d",*ptr);
}
answered Apr 22, 2017 at 19:57
0
Тамика Котовчанин 942 / 482 / 200 Регистрация: 16.02.2010 Сообщений: 3,338 Записей в блоге: 37 |
||||
1 |
||||
Размер структуры30.11.2016, 15:52. Показов 18923. Ответов 19 Метки нет (Все метки)
Всем доброго дня! Не могу понять… Вот код.
Выводит размер структуры как 20… Почему 20? Почему не 17?.. Заранее спасибо!
1 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
30.11.2016, 15:52 |
19 |
4816 / 2276 / 287 Регистрация: 01.03.2013 Сообщений: 5,944 Записей в блоге: 27 |
|
30.11.2016, 15:55 |
2 |
Мобыть выравнивание лесов/полей?
1 |
Котовчанин 942 / 482 / 200 Регистрация: 16.02.2010 Сообщений: 3,338 Записей в блоге: 37 |
|
30.11.2016, 15:57 [ТС] |
3 |
Мобыть выравнивание лесов/полей? Так а как оно происходит?
0 |
4816 / 2276 / 287 Регистрация: 01.03.2013 Сообщений: 5,944 Записей в блоге: 27 |
|
30.11.2016, 16:00 |
4 |
Я не спец, но думаю, как компилятор на память положит. Может есть какие прагмы чтобы влиять на его поведение в этих случаях. Можно погуглить, начав с «выравнивание полей структур». Может у вас 32-разрядная система и компилятор под чары в структурах выделяет размер регистра — 4 байта.
1 |
Модератор 13102 / 10374 / 6207 Регистрация: 18.12.2011 Сообщений: 27,753 |
|
30.11.2016, 16:02 |
5 |
Выравнивание идет на границы 32 битного слова.
1 |
Тамика Котовчанин 942 / 482 / 200 Регистрация: 16.02.2010 Сообщений: 3,338 Записей в блоге: 37 |
||||||||
30.11.2016, 16:06 [ТС] |
6 |
|||||||
zss, то есть, любой тип приводится к 4-м?
например.
тоже
0 |
4816 / 2276 / 287 Регистрация: 01.03.2013 Сообщений: 5,944 Записей в блоге: 27 |
|
30.11.2016, 16:10 |
7 |
Имхо к длине машинного слова данной архитектуры. В вашем случае это 4 байта.
1 |
Котовчанин 942 / 482 / 200 Регистрация: 16.02.2010 Сообщений: 3,338 Записей в блоге: 37 |
|
30.11.2016, 16:13 [ТС] |
8 |
_Ivana, zss, дошло, спасибо!
0 |
4816 / 2276 / 287 Регистрация: 01.03.2013 Сообщений: 5,944 Записей в блоге: 27 |
|
30.11.2016, 16:18 |
9 |
Тамика, раз пошла такая пьянка — попробуйте запилить структуру с 4 чарами подряд и двумя интами и посмотрите ее размер. А потом погуглите какую-нибудь packed — прагму или что там бывает, чтобы добиться ужатия первых четырех чаров в одно 32-битное слово.
1 |
Тамика Котовчанин 942 / 482 / 200 Регистрация: 16.02.2010 Сообщений: 3,338 Записей в блоге: 37 |
||||
30.11.2016, 16:19 [ТС] |
10 |
|||
Практика подтвердила!
Добавлено через 33 секунды
packed — прагму Простите, но… Энто што?..
0 |
4816 / 2276 / 287 Регистрация: 01.03.2013 Сообщений: 5,944 Записей в блоге: 27 |
|
30.11.2016, 16:21 |
11 |
Это я так называю любые волшебные мутаборы, которые могут указать компилятору определенное поведение, например ужимать/паковать поля структур для уменьшения размера памяти или транжирить байты ради скорости доступа.
0 |
Тамика Котовчанин 942 / 482 / 200 Регистрация: 16.02.2010 Сообщений: 3,338 Записей в блоге: 37 |
||||
30.11.2016, 16:21 [ТС] |
12 |
|||
_Ivana, кажется, оно само это делает…
Вы ведь это имели в виду?
0 |
17409 / 9246 / 2259 Регистрация: 30.01.2014 Сообщений: 16,168 |
|
30.11.2016, 16:22 |
13 |
2 |
4816 / 2276 / 287 Регистрация: 01.03.2013 Сообщений: 5,944 Записей в блоге: 27 |
|
30.11.2016, 16:25 |
14 |
_Ivana, кажется, оно само это делает… Значит у вас или по-умолчанию включены эти мутаборы, или это безмутаборное поведение по-умолчанию вообще ЗЫ Как только мы ушли от ручного ассемблера к компиляторам, мы потеряли 2 важных вещи — управление временем выполнения и размещением данных в памяти. Променяли это на остальные плюшки и постепенно теряем контроль, передавая его искусственному интеллекту
0 |
17409 / 9246 / 2259 Регистрация: 30.01.2014 Сообщений: 16,168 |
|
30.11.2016, 16:30 |
15 |
кажется, оно само это делает… Не оно само, а ты сама
1 |
Тамика Котовчанин 942 / 482 / 200 Регистрация: 16.02.2010 Сообщений: 3,338 Записей в блоге: 37 |
||||
30.11.2016, 16:34 [ТС] |
16 |
|||
DrOffset, а я пробовала и с трёмя чариками, и с двумя, и с одним. А вот такая штука опять меня запутала… Почему если инт первый, то под чар выделяется 4 байта. Если чар один и первый — 1 байт?.. Расположение на позицию кратную 4 тут не котируется, потому что инт первый.
0 |
17409 / 9246 / 2259 Регистрация: 30.01.2014 Сообщений: 16,168 |
|
30.11.2016, 16:57 |
17 |
А вот такая штука опять меня запутала… Почему если инт первый, то под чар выделяется 4 байта. Если чар один и первый — 1 байт?.. Расположение на позицию кратную 4 тут не котируется, потому что инт первый Потому что выравнивание зависит от типа, а относится к адресу. Добавлено через 4 минуты
1 |
Котовчанин 942 / 482 / 200 Регистрация: 16.02.2010 Сообщений: 3,338 Записей в блоге: 37 |
|
30.11.2016, 17:01 [ТС] |
18 |
DrOffset, получается, у меня машинное слово это 4?
0 |
17409 / 9246 / 2259 Регистрация: 30.01.2014 Сообщений: 16,168 |
|
30.11.2016, 17:04 |
19 |
у меня машинное слово это 4? Да.
1 |
Котовчанин 942 / 482 / 200 Регистрация: 16.02.2010 Сообщений: 3,338 Записей в блоге: 37 |
|
30.11.2016, 17:05 [ТС] |
20 |
DrOffset, спасиииибо
0 |
Как узнать размер структуры (в байтах)?
|
От: |
ktin |
|
Дата: | 29.05.06 14:40 | ||
Оценка: |
Структура состоит из Value-типов.
Нужно узнать её размер.
Подскажите как это сделать (ручками пересчитывать разные value-типы, умножая на их размерность в байтах — не катит)
Re: Как узнать размер структуры (в байтах)?
|
От: |
GlebZ |
|
Дата: | 29.05.06 14:43 | ||
Оценка: |
Здравствуйте, ktin, Вы писали:
K>Структура состоит из Value-типов.
K>Нужно узнать её размер.
K>Подскажите как это сделать (ручками пересчитывать разные value-типы, умножая на их размерность в байтах — не катит)
Marshal.SizeOf
Re: Как узнать размер структуры (в байтах)?
|
От: |
Pavel_Agurov |
|
Дата: | 29.05.06 14:45 | ||
Оценка: |
Marshal.SizeOf(структура); подойдет?
Re: Как узнать размер структуры (в байтах)?
|
От: |
VladGalkin |
|
Дата: | 29.05.06 14:46 | ||
Оценка: |
Здравствуйте, ktin, Вы писали:
K>Структура состоит из Value-типов.
K>Нужно узнать её размер.
K>Подскажите как это сделать (ручками пересчитывать разные value-типы, умножая на их размерность в байтах — не катит)
sizeof
не катит?
… << RSDN@Home 1.1.4 stable SR1 rev. 568>>
ДЭ!
Re[2]: Как узнать размер структуры (в байтах)?
|
От: |
krasin |
|
Дата: | 29.05.06 15:52 | ||
Оценка: |
+1 |
Здравствуйте, VladGalkin, Вы писали:
VG>Здравствуйте, ktin, Вы писали:
K>>Структура состоит из Value-типов.
K>>Нужно узнать её размер.
K>>Подскажите как это сделать (ручками пересчитывать разные value-типы, умножая на их размерность в байтах — не катит)
VG>
sizeof
не катит?
Доступно только в unsafe
Re[3]: Как узнать размер структуры (в байтах)?
|
От: |
VladGalkin |
|
Дата: | 29.05.06 15:53 | ||
Оценка: |
Здравствуйте, krasin, Вы писали:
VG>>
sizeof
не катит?
K>Доступно только в unsafe
From version 2.0 of C# onwards, applying sizeof to predefined types no longer requires that unsafe mode be used.
… << RSDN@Home 1.1.4 stable SR1 rev. 568>>
ДЭ!
Re[4]: Как узнать размер структуры (в байтах)?
|
От: |
VladGalkin |
|
Дата: | 29.05.06 15:55 | ||
Оценка: |
Здравствуйте, VladGalkin, Вы писали:
VG>
VG>From version 2.0 of C# onwards, applying sizeof to predefined types no longer requires that unsafe mode be used.
Пардон, эт только для predefined types.
… << RSDN@Home 1.1.4 stable SR1 rev. 568>>
ДЭ!
Re[2]: Как узнать размер структуры (в байтах)?
|
От: |
ktin |
|
Дата: | 30.05.06 06:43 | ||
Оценка: |
Здравствуйте, Pavel_Agurov,
дополнение — нужно узнать размер экземпляра структуры, заполненной данными.
не подойдет. объясняю почему.
существует структура
struct mystr
{
public string strin;
public int i;
}
создаем экземпляр и заполняем.
mystr z = new mystr();
z.i = 45;
z.strin = "its my wonderful string";
Console.WriteLine(Marshal.SizeOf(z));
ответ: 8 (указатель + int).
а хотелось бы получить размер строчки + int (в данном примере, по крайней мере)
есть идеи?
з.ы. думалось в куче создавать структурку, потом разницу адресов смотреть — но это не thread safe получается.
Вы писали:
P_A>Marshal.SizeOf(структура); подойдет?
Re[5]: Как узнать размер структуры (в байтах)?
|
От: |
ktin |
|
Дата: | 30.05.06 06:44 | ||
Оценка: |
Здравствуйте, VladGalkin,
ага.
а необходимо найти размер живой структуры, заполненной данными.
(
http://www.rsdn.ru/Forum/Message.aspx?mid=1925259&only=1
Автор: ktin
Дата: 30.05.06
)
Вы писали:
VG>Пардон, эт только для predefined types.
Re[6]: Как узнать размер структуры (в байтах)?
|
От: |
Mab |
http://shade.msu.ru/~mab |
Дата: | 30.05.06 06:53 | ||
Оценка: |
Здравствуйте, ktin, Вы писали:
K>а необходимо найти размер живой структуры, заполненной данными.
Надеюсь, есть понимание, что эти данные вовсе не лежат рядом со структурой ни в каком смысле?
Если по-прежнему хочется именно такого размера, то считать придется руками.
Re[3]: Как узнать размер структуры (в байтах)?
|
От: |
Pavel_Agurov |
|
Дата: | 30.05.06 06:57 | ||
Оценка: |
Сомневаюсь что со строками это прокатит. Строки-то в хеше лежат…
В обратную сторону можно, например,
// Device interface detail data
[StructLayout(LayoutKind.Sequential, CharSet= CharSet.Ansi)]
public unsafe struct PSP_DEVICE_INTERFACE_DETAIL_DATA
{
public int cbSize;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst= 256)]
public string DevicePath;
}
А вот чтобы просто sizeof…
Может от задачи пойти — типа зачем это надо и обойти другим путем.
Re[4]: Как узнать размер структуры (в байтах)?
|
От: |
Mab |
http://shade.msu.ru/~mab |
Дата: | 30.05.06 06:59 | ||
Оценка: |
Здравствуйте, Pavel_Agurov, Вы писали:
P_A>Сомневаюсь что со строками это прокатит. Строки-то в хеше лежат…
Большинство строк лежат в куче. Некоторые — в пуле.
Re[6]: Как узнать размер структуры (в байтах)?
|
От: |
VladGalkin |
|
Дата: | 30.05.06 07:27 | ||
Оценка: |
Здравствуйте, ktin, Вы писали:
K>ага.
K>а необходимо найти размер живой структуры, заполненной данными.
Не хочу показаться излишне придирающимся к словам, но в вопросе ничего про необходимость safe не сказано.
… << RSDN@Home 1.1.4 stable SR1 rev. 568>>
ДЭ!
Re[7]: Как узнать размер структуры (в байтах)?
|
От: |
ktin |
|
Дата: | 30.05.06 07:28 | ||
Оценка: |
Здравствуйте, Mab,
да,понимание есть.
поэтому то и спрашиваю(т.к. не знаю как считать).
Вы писали:
K>>а необходимо найти размер живой структуры, заполненной данными.
Mab>Надеюсь, есть понимание, что эти данные вовсе не лежат рядом со структурой ни в каком смысле?
Mab>Если по-прежнему хочется именно такого размера, то считать придется руками.
Re[4]: Как узнать размер структуры (в байтах)?
|
От: |
ktin |
|
Дата: | 30.05.06 07:34 | ||
Оценка: |
Здравствуйте, Pavel_Agurov,
а что этим кодом сделали?
описали структуру для Маршалинга в unmanaged код? (если да — то как это осуществляется?)
может это то что нужно?
задача: всю память, которую занимает данная структура передать библиотеке (с максимальной скоростью).
Вы писали:
P_A>Сомневаюсь что со строками это прокатит. Строки-то в хеше лежат…
P_A>В обратную сторону можно, например,
P_A>
P_A> // Device interface detail data
P_A> [StructLayout(LayoutKind.Sequential, CharSet= CharSet.Ansi)]
P_A> public unsafe struct PSP_DEVICE_INTERFACE_DETAIL_DATA
P_A> {
P_A> public int cbSize;
P_A> [MarshalAs(UnmanagedType.ByValTStr, SizeConst= 256)]
P_A> public string DevicePath;
P_A> }
P_A>
P_A>А вот чтобы просто sizeof…
P_A>Может от задачи пойти — типа зачем это надо и обойти другим путем.
Re[7]: Как узнать размер структуры (в байтах)?
|
От: |
ktin |
|
Дата: | 30.05.06 07:40 | ||
Оценка: |
Здравствуйте, VladGalkin, Вы писали:
Можно, можно unsafe использовать! рад любому решению.
Только sizeof НЕ катит. ну не работает он.
int v;
unsafe
{
v=sizeof(z);
}
Error: The type or namespace name ‘z’ could not be found (are you missing a using directive or an assembly reference?)
VG>Не хочу показаться излишне придирающимся к словам, но в вопросе ничего про необходимость safe не сказано.
Re[8]: Как узнать размер структуры (в байтах)?
|
От: |
VladGalkin |
|
Дата: | 30.05.06 08:01 | ||
Оценка: |
Здравствуйте, ktin, Вы писали:
K>Можно, можно unsafe использовать! рад любому решению.
K>Только sizeof НЕ катит. ну не работает он.
K>
K> int v;
K> unsafe
K> {
K> v=sizeof(z);
K> }
K>
K>Error: The type or namespace name ‘z’ could not be found (are you missing a using directive or an assembly reference?)
Так это, как грицца проблема вовсе не в sizeof. Нормально он работает.
using System;
namespace ConsoleApplication1
{
public struct z
{
public int a;
};
class Program
{
unsafe static void Main(string[] args)
{
unsafe
{
Console.WriteLine(sizeof(z));
}
}
}
}
Компилировать с ключом /unsafe.
Выводит:
4
… << RSDN@Home 1.1.4 stable SR1 rev. 568>>
ДЭ!
Re[9]: Как узнать размер структуры (в байтах)?
|
От: |
VladGalkin |
|
Дата: | 30.05.06 08:06 | ||
Оценка: |
Здравствуйте, VladGalkin, Вы писали:
VG>
VG>using System;
VG>namespace ConsoleApplication1
VG>{
VG> public struct z
VG> {
VG> public int a;
VG> };
VG> class Program
VG> {
VG> unsafe static void Main(string[] args)
VG> {
VG> unsafe
VG> {
VG> Console.WriteLine(sizeof(z));
VG> }
VG> }
VG> }
VG>}
VG>
Конечно, первый unsafe можно удалить.
… << RSDN@Home 1.1.4 stable SR1 rev. 568>>
ДЭ!
Re[9]: Как узнать размер структуры (в байтах)?
|
От: |
ktin |
|
Дата: | 30.05.06 08:19 | ||
Оценка: |
Здравствуйте, VladGalkin, Вы писали:
=) да нормально он работает, на predefined типов.
для ТИПОВ. не переменных.
нужно определить сколько занимает экземпляр, данная переменная. а не тип вообще.
http://www.rsdn.ru/Forum/Message.aspx?mid=1925259&only=1
Автор: ktin
Дата: 30.05.06
(в том примере структура — 8 байт, но экземпляр будем много больше — строчка ещё сколько занимает)
вот.
VG>Так это, как грицца проблема вовсе не в sizeof. Нормально он работает.
VG>
VG>using System;
VG>namespace ConsoleApplication1
VG>{
VG> public struct z
VG> {
VG> public int a;
VG> };
VG> class Program
VG> {
VG> unsafe static void Main(string[] args)
VG> {
VG> unsafe
VG> {
VG> Console.WriteLine(sizeof(z));
VG> }
VG> }
VG> }
VG>}
VG>
VG>Компилировать с ключом /unsafe.
VG>Выводит:
VG>
VG>4
Re[10]: Как узнать размер структуры (в байтах)?
|
От: |
VladGalkin |
|
Дата: | 30.05.06 08:26 | ||
Оценка: |
Здравствуйте, ktin, Вы писали:
K>(в том примере структура — 8 байт, но экземпляр будем много больше — строчка ещё сколько занимает)
K>вот.
«Учится, учится и учится!» (С)
String это reference-тип, размер ссылки — 4 байта.
… << RSDN@Home 1.1.4 stable SR1 rev. 568>>
ДЭ!
Re[10]: Как узнать размер структуры (в байтах)?
|
От: |
VladGalkin |
|
Дата: | 30.05.06 08:31 | ||
Оценка: |
Здравствуйте, ktin, Вы писали:
K>=) да нормально он работает, на predefined типов.
K>для ТИПОВ. не переменных.
K>нужно определить сколько занимает экземпляр, данная переменная. а не тип вообще.
K>http://www.rsdn.ru/Forum/Message.aspx?mid=1925259&only=1
Автор: ktin
Дата: 30.05.06
K>(в том примере структура — 8 байт, но экземпляр будем много больше — строчка ещё сколько занимает)
Re[6]: Как узнать размер структуры (в байтах)?
Автор: Mab
Дата: 30.05.06
Сдается, этого понимания таки нет.
… << RSDN@Home 1.1.4 stable SR1 rev. 568>>
ДЭ!
Re[11]: Как узнать размер структуры (в байтах)?
|
От: |
ktin |
|
Дата: | 30.05.06 08:38 | ||
Оценка: |
Здравствуйте, VladGalkin,
вот именно!!!
а мне нужен размер «ВСЕГО хозяйства».
8 байт то я получу (как и писал ссылка — 4, Int -4 4+4=8) без проблем. =)))
мне они НЕ нужны.
Вы писали:
VG>String это reference-тип, размер ссылки — 4 байта.
Re[11]: Как узнать размер структуры (в байтах)?
|
От: |
ktin |
|
Дата: | 30.05.06 08:41 | ||
Оценка: |
Здравствуйте, VladGalkin, Вы писали:
хорошо, давай я напишу следующим образом, если не понятно:
мне нужно узнать размер, который занимает структура, вместе с той памятью, которую занимают объекты(будь то массивы байт, чаров (наш стринг, ага?) или интов) по ссылкам (references) из структуры, независимо от того, где они лежат в памяти.
важен результат — СКОЛЬКО.
VG>Re[6]: Как узнать размер структуры (в байтах)?
Автор: Mab
Дата: 30.05.06
VG>Сдается, этого понимания таки нет.
Re[12]: Как узнать размер структуры (в байтах)?
|
От: |
VladGalkin |
|
Дата: | 30.05.06 08:46 | ||
Оценка: |
Здравствуйте, ktin, Вы писали:
K>хорошо, давай я напишу следующим образом, если не понятно:
K>мне нужно узнать размер, который занимает структура, вместе с той памятью, которую занимают объекты(будь то массивы байт, чаров (наш стринг, ага?) или интов) по ссылкам (references) из структуры, независимо от того, где они лежат в памяти.
K>важен результат — СКОЛЬКО.
Вот, я же линк дал на сообщение, где четко написано про данные, которые не лежат вместе с этой струкурой и про подсчет ручками. А теперь задним числом ещё мне и объяснять это…
… << RSDN@Home 1.1.4 stable SR1 rev. 568>>
ДЭ!
Re[12]: Как узнать размер структуры (в байтах)?
|
От: |
GlebZ |
|
Дата: | 30.05.06 08:46 | ||
Оценка: |
Здравствуйте, ktin, Вы писали:
K>хорошо, давай я напишу следующим образом, если не понятно:
K>мне нужно узнать размер, который занимает структура, вместе с той памятью, которую занимают объекты(будь то массивы байт, чаров (наш стринг, ага?) или интов) по ссылкам (references) из структуры, независимо от того, где они лежат в памяти.
K>важен результат — СКОЛЬКО.
Ты бы сказал зачем это нужно? Тот же string, по крайней мере, после StringBuilder имеет разное количество байт в памяти и количество символов.
Re: Как узнать размер структуры (в байтах)?
|
От: |
_FRED_ |
@ViIvanov |
Дата: | 30.05.06 08:52 | ||
Оценка: |
Здравствуйте, ktin, Вы писали:
K>Структура состоит из Value-типов.
K>Нужно узнать её размер.
K>Подскажите как это сделать (ручками пересчитывать разные value-типы, умножая на их размерность в байтах — не катит)
Сериализовать структуру BinaryFormatter`ом и вычислить изменение длины стрима.
… << RSDN@Home 1.2.0 alpha rev. 650>>
Now playing: «Тихо в лесу…»
Help will always be given at Hogwarts to those who ask for it.
Re[3]: Как узнать размер структуры (в байтах)?
|
От: |
_FRED_ |
@ViIvanov |
Дата: | 30.05.06 08:52 | ||
Оценка: |
Здравствуйте, ktin, Вы писали:
K>дополнение — нужно узнать размер экземпляра структуры, заполненной данными.
K>не подойдет. объясняю почему.
K>существует структура
K> struct mystr
K> {
K> public string strin;
K> public int i;
K> }
А как же
K>Структура состоит из Value-типов.
в первой строке
корневого сообщения
Автор: ktin
Дата: 29.05.06
? Ведь string — не «Value-тип»
… << RSDN@Home 1.2.0 alpha rev. 650>>
Now playing: «Тихо в лесу…»
Help will always be given at Hogwarts to those who ask for it.
Re[13]: Как узнать размер структуры (в байтах)?
|
От: |
ktin |
|
Дата: | 30.05.06 09:05 | ||
Оценка: |
Здравствуйте, GlebZ, Вы писали:
написал.
задача: всю память, которую занимает данная структура передать библиотеке (с максимальной скоростью), чтобы этот «образ» там хранить, или записать в файл (буквально таки сериализация).
GZ>Ты бы сказал зачем это нужно? Тот же string, по крайней мере, после StringBuilder имеет разное количество байт в памяти и количество символов.
Re[13]: Как узнать размер структуры (в байтах)?
|
От: |
ktin |
|
Дата: | 30.05.06 09:07 | ||
Оценка: |
Здравствуйте, VladGalkin,
тобишь твой ответ — никак без ручек?
Вы писали:
VG>Вот, я же линк дал на сообщение, где четко написано про данные, которые не лежат вместе с этой струкурой и про подсчет ручками. А теперь задним числом ещё мне и объяснять это…
Re[2]: Как узнать размер структуры (в байтах)?
|
От: |
Lloyd |
|
Дата: | 30.05.06 09:11 | ||
Оценка: |
+2 |
Здравствуйте, _FRED_, Вы писали:
_FR>Сериализовать структуру BinaryFormatter`ом и вычислить изменение длины стрима.
Если мне не изменяет память BinaryFormatter сохряняет также информацию о типах сохраняемых данных. Так что твоя реккомендация к желаемому результату не приведет.
… << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Как узнать размер структуры (в байтах)?
|
От: | Аноним | |
Дата: | 30.05.06 07:37 | ||
Оценка: |
Marshal.Sizeof() прекрасно работает и со строками, и с массивами, и с вложенными структурами… Для массивов надо использовать атрибут [MarshalAs(UnmanagedType.ByValArray, SizeConst = )]. Проверялось при создании своей сериализации данных. Структуры, кстати, объявлялись с атрибутом: [StructLayout(LayoutKind.Sequential, Pack = 1)] .
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[4]: Как узнать размер структуры (в байтах)?
|
От: | Аноним | |
Дата: | 30.05.06 07:40 | ||
Оценка: |
Кстати, с каких пор string стал value-типом? А последний пример вполне адекватен для указанной задачи. Как раз так и делали, используя и другие члены Marshal…
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
- Переместить
- Удалить
- Выделить ветку
Пока на собственное сообщение не было ответов, его можно удалить.
Я понимаю, что «размер(а) == 8» Ну, на 32-разрядной машине. Общий размер конструкции будет зависеть от упаковки: в моем случае, по умолчанию упаковка 4, так что ‘с’ занимает 4 байта, ‘б’ занимает один байт, оставляя 3 дополнительных байта, чтобы довести ее до следующего значения, кратного 4: 8. Если вы хотите изменить эту упаковку, большинство компиляторов есть способ, чтобы изменить его, например, в MSVC:
дает размер(а) == 5. Если вы сделаете это, будьте осторожны, чтобы сбросить упаковка перед любой библиотеке заголовки!