Как найти размер структуры

struct a
{
    char *c;
    char b;
};

What is sizeof(a)?

GEOCHET's user avatar

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 Buchan's user avatar

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 Leffler's user avatar

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 Hubbard's user avatar

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

eugensk's user avatar

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

mdec's user avatar

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 Brocious's user avatar

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 Larson's user avatar

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.

Jonathan Leffler's user avatar

answered Sep 27, 2008 at 5:17

computinglife's user avatar

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's user avatar

Jacob Schoen

14k15 gold badges80 silver badges102 bronze badges

asked Sep 12, 2011 at 3:36

sam's user avatar

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 Lindley's user avatar

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

Mysticial's user avatar

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 Lutz's user avatar

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 Gupta's user avatar

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

Jean-Pascal Billaud's user avatar

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

Amit Tandel's user avatar

struct  ABC

{

int a;

float b;

char c;

};


void main()
{

struct ABC *ptr=(struct ABC *)0;

ptr++;

printf("Size of structure is: %d",*ptr);

}

mehrdad khosravi's user avatar

answered Apr 22, 2017 at 19:57

Mudassir Hussain's user avatar

0

Тамика

Котовчанин

942 / 482 / 200

Регистрация: 16.02.2010

Сообщений: 3,338

Записей в блоге: 37

1

Размер структуры

30.11.2016, 15:52. Показов 18923. Ответов 19

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Всем доброго дня!

Не могу понять… Вот код.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct T
{
    char i;
    int a;
    int b;
    int c;
    char j;
};
 
int main()
{
    T t;
    std::cout << sizeof(T);
    system("pause>nul");
}

Выводит размер структуры как 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

Цитата
Сообщение от _Ivana
Посмотреть сообщение

Мобыть выравнивание лесов/полей?

Так а как оно происходит?



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 битного слова.
Поэтому после каждого из char останется по 3 байта.
Итого: (1+3)+3*4+(1+3)=20 байт.



1



Тамика

Котовчанин

942 / 482 / 200

Регистрация: 16.02.2010

Сообщений: 3,338

Записей в блоге: 37

30.11.2016, 16:06

 [ТС]

6

zss, то есть, любой тип приводится к 4-м?
Все, что меньше 4-х:

C++
1
char x[3];

например.

C++
1
short x;

тоже



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

Практика подтвердила!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
struct T
{
    short int i;
    int a = 66;
    int b = 77;
    int c = 88;
    char j;
};
 
void show(const char* aT, size_t size)
{
    for (int i = 0; i < size; ++i)
        std::cout << "i " << static_cast<int>(aT[i]) << "n";
}
 
int main()
{
    T t;
    show(static_cast<char*>(static_cast<void*>(&t)), sizeof(t));
    system("pause>nul");
}

Добавлено через 33 секунды

Цитата
Сообщение от _Ivana
Посмотреть сообщение

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, кажется, оно само это делает…

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct T
{
    char i = 0;
    char j = 0;
    char g = 0;
    char h = 0;
    int a = 66;
    int b = 77;
};
 
void show(const char* aT, size_t size)
{
    for (int i = 0; i < size; ++i)
        std::cout << "i " << static_cast<int>(aT[i]) << "n";
}
 
int main()
{
    T t;
    show(static_cast<char*>(static_cast<void*>(&t)), sizeof(t));
    system("pause>nul");
}

Вы ведь это имели в виду?



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 тут не котируется, потому что инт первый.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
struct T1
{
    int c = 88;
    char j = 0;
};
 
struct T2
{
    char i = 0;
};
 
void show(const char* aT, size_t size)
{
    std::cout << "nNEWn";
    for (int i = 0; i < size; ++i)
        std::cout << i << " " << static_cast<int>(aT[i]) << "n";
}
 
int main()
{
    T1 t1;
    T2 t2;
    show(static_cast<char*>(static_cast<void*>(&t1)), sizeof(t1));
    show(static_cast<char*>(static_cast<void*>(&t2)), sizeof(t2));
    system("pause>nul");
}



0



17409 / 9246 / 2259

Регистрация: 30.01.2014

Сообщений: 16,168

30.11.2016, 16:57

17

Цитата
Сообщение от Тамика
Посмотреть сообщение

А вот такая штука опять меня запутала… Почему если инт первый, то под чар выделяется 4 байта. Если чар один и первый — 1 байт?.. Расположение на позицию кратную 4 тут не котируется, потому что инт первый

Потому что выравнивание зависит от типа, а относится к адресу.
Может быть проще будет пользоваться вот таким более строгим определением:
Адреса всех данных размером 2n байт при n >= размеру машинного слова должны делиться на 2(размер машинного слова).

Добавлено через 4 минуты
Тамика, вот хороший материал по теме: http://konishchevdmitry.blogsp… -post.html



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&amp;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&amp;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&amp;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
ссылка на оригинальное сообщение

Подождите ...

Wait...

  • Переместить
  • Удалить
  • Выделить ветку

Пока на собственное сообщение не было ответов, его можно удалить.

Я понимаю, что «размер(а) == 8» Ну, на 32-разрядной машине. Общий размер конструкции будет зависеть от упаковки: в моем случае, по умолчанию упаковка 4, так что ‘с’ занимает 4 байта, ‘б’ занимает один байт, оставляя 3 дополнительных байта, чтобы довести ее до следующего значения, кратного 4: 8. Если вы хотите изменить эту упаковку, большинство компиляторов есть способ, чтобы изменить его, например, в MSVC:

дает размер(а) == 5. Если вы сделаете это, будьте осторожны, чтобы сбросить упаковка перед любой библиотеке заголовки!

Понравилась статья? Поделить с друзьями:
  • Почему вылетает сталкер тайные тропы 2 как исправить
  • Сталкер оп 2 как найти пантеру
  • Стилист как найти свой образ
  • Как найти деревню с компотом в майнкрафте
  • Как правильно составить предложения к государству