Как узнать размер структуры
Узнать размер структуры
Как узнать размер массива или структуры
Привет всем! Раньше писал на C++, сейчас потихоньку начал изучать C#. Есть какая-нибудь.
Как узнать размер строки как размер массива
const char* test_str = «01234\x00 789»; //очевидно, что strlen(test_str) == 5; sizeof(test_str).
Размер структуры
Добрый день! Дорогие форумчане, помогите если не трудно. такая проблема: есть структура.
Размер структуры
Всем доброго дня! Не могу понять. Вот код. struct T < char i; int a; int b; int c;.
А зачем вам размер managed структуры? Всё правильно он требует.
Добавлено через 8 минут
Оптимизации чего? Как вы определили что данная оптимизация вообще требуется?
Да, но есть четкие правила, по которым определяется управляемая структура или нет.
Конечно зависит, размер указателей то разный.
Значит не полностью, раз sizeof и Marshal.SizeOf () с ними не работают.
Добавлено через 6 минут
Еще есть Unsafe.SizeOf из пакета System.Runtime.CompilerServices.Unsafe.
Почти идентичный код на C++ работает в 2,5 раза быстрее чем C#, и там, и там включены почти все возможные оптимизации, используются указатели, минимизировано число операций, не вызываются функции (call), целочисленная арифметика, предварительный расчет часто повторяющихся формул и т.д.
Тогда такой вопрос: может ли структура быть неуправляемой без слова unsafe? Я вроде думал что нет. Если да, то правильно ли я понял, что если внутри используются только значимые стандартные типы и/или другие неуправляемые структуры, то она считается неуправляемой? Где можно про это почитать подробно, со всеми нюансами?
Любые ссылки (например строка, массив, делегат) по сути являются указателями если являются полем структуры.
Например размер этой структуры на x64 равен 8 (из-за ссылки на массив):
struct Foo
<
public byte[] data;
public Foo(int x)
<
data = new byte[100];
>
>
BestProg
Содержание
Поиск на других ресурсах:
1. Какое назначение операции sizeof в программах на C++?
Операция sizeof предназначена для определения размера типа данных, переменной базового типа, переменной структурного типа, числового значения, строчного значения и т.п.
Операция sizeof есть полезной в случаях, когда необходимо динамически выделять память для переменных. В этом случае нужно знать объем памяти, которую занимает объект того или другого типа.
Общий вид операции sizeof :
2. Примеры использования операции sizeof для базовых типов и числовых значений
В приведенном ниже фрагменте кода приведен пример определения размера переменной базового типа, числового значения, строчного значения или результата выражения.
3. Как определить размер структурной переменной? Пример
Пусть задана структурная переменная, описывающая данные о студенте. Шаблон структуры описывается в отдельном файле «MyStruct_Student.h» :
4. Как определить размер массива чисел? Пример
5. Как определить размер массива структур? Пример
Пусть задана структурная переменная, описывающая данные о студенте. Шаблон структуры описывается в отдельном файле «MyStruct_Student.h» :
6. Как определить размер объекта (экземпляра) класса? Пример
Пусть в модуле «MyClass.h» описывается класс с именем MyPoint :
Чтобы определить размер памяти, которая выделяется для объекта этого класса, нужно написать такой программный код:
Как видно из результата, операция sizeof() определяет объем памяти, который выделяется под переменные (поля) класса.
7. Как определить размер массива объектов класса? Пример
Пусть в модуле «MyClass.h» описывается класс с именем MyPoint :
В нижеследующем фрагменте кода вычисляется минимальное значение между двумя переменными a и b :
Как получить размер поля структуры в си?
Скажем есть структура:
берёшь и получаешь
А без рантайм вычислений никак? На стадии компиляции.
А где здесь рантайм? O_o
В последнем варианте наверное будет более корректно использовать decltype вместо sizeof. Но так как вопрос все равно о си, то юзай первый вариант или что-то в этом роде.
Ну да, сглупил. Всем откликнувшимся спасибо.
Не вместо, а вместе. Весь день какую-то дичь выдаю=)
Просто на C++, любой версии, без выбоенов с std::declval:
Да ну, хипстерство. Если уж так нужно узнать, то нехай развертывает до стандартных типов, а когда получится ровно то, что в примере топика, то есть long, то уж sizeof этого то узнать можно многими способами.
Если кому интересно, то кроскомпиляторный метод определения размера типа заключается в попытке скомпилить: switch(sizeof(TYPE)) < case 4: break; case sizeof(TYPE): break; >Как ругнётся, значить угадали :))
Что за сборище наркоманов в этом треде изобретает sizeof?
Это вне функции работать не будет, по-моему.
Кстати, интересная тема: изобрести sizeof. У меня получилось так:
Интересно, что здесь может пойти не так.
Интересно, что здесь может пойти не так.
6.5.3.2 (Address and indirection operators), параграф 4
The unary * operator denotes indirection. If the operand points to a function, the result is a function designator; if it points to an object, the result is an lvalue designating the object. If the operand has type ‘‘pointer to type’’, the result has type ‘‘type’’. If an invalid value has been assigned to the pointer, the behavior of the unary * operator is undefined.(сноска)
В сноске написано:
Among the invalid values for dereferencing a pointer by the unary * operator are a null pointer, an address inappropriately aligned for the type of object pointed to, and the address of an object after the end of its lifetime.
Несколько слов о размере структур в С/С++ и о том, почему так получилось
Ниже по тексту термином «платформа» будем называть любой заданный набор из процессора, компилятора и операционной системы, под которой скомпилированный код будет запускаться.
И на весь этот зоопарк существует один-единственный Стандарт языка C. Как же это удалось? Вот тут и начинается самое интересное.
Язык C даёт очень мало ограничений на то, какими именно должны быть его базовые типы (char, short, int, long, float, double). Задаётся минимальное количество бит для некоторых типов (например, тип «char» должен быть минимум 8 бит, «int»/«short» — 16, «long» — 32), задаётся, что размеры базовых типов кратны размеру char’а, а сам размер char’а тождественно равен единице.
И, для примера: у программ под MS-DOS размер int’а и short’а совпадал, а сами эти типы были 16-битными. Для платформы Win32 размер int’а уже стал другим — 32 бита.
Другой важный момент из «мира железа», который обязан был учитываться при разработке Стандарта — это то, как процессор работает с памятью. Если не углубляться в то, как функционирует шина адреса, шина данных и микросхемы памяти, то для подавляющего числа архитектур существует следующее правило: если читаем/записываем одной командой N-байтовую величину, то её адрес обязан быть кратным N. То есть, если в память записывается 4-байтовый int, адрес должен делиться нацело на 4. Аналогично для 2-байтовых short’ов и т.п.
Что происходит, если это правило не выполняется? На разных платформах — по-разному: на некоторых (ARM’ы, например) происходит прерывание работы процессора и управление передаётся в ядро ОС, на других (DSP от TI) процессор просто молча запишет по ближайшему кратному адресу (т.е. не туда, куда сказали, а рядом), а на платформе x86 процессор (для некоторых типов данных) сделает так, как подразумевал программист, за счёт некоторого падения производительности. Важно тут понять одно — все процессоры работают одинаково, когда адрес является выравненным, и кто во что горазд — при невыполнении этого требования. Именно поэтому определение выравнивания (alignment) определяется в самом начале Стандарта и постоянно упоминается при описании модели памяти языка.
К чему же это всё приводит с точки зрения программиста? Лучше всего это показать на примере. Допустим, у нас есть такая структура:
С точки зрения программиста (неопытного) размер этой структуры равен sizeof(int)+sizeof(char)=4+1=5 (подразумеваем, что размер int’а — 4 байта). Однако, что произойдёт, если объявить массив из нескольких элементов такого типа? В памяти они будут располагаться так:
Или словами: поле iiii первого элемента располагается по выравненному адресу, а для второго элемента это уже не выполняется. Т.е. при размере структуры Foo равном 5 нельзя выполнить требования модели памяти С.
Для того же, чтобы и овцы были целы, и волки сыты, компилятор вставляет «невидимые» (для программиста) дополнительных 3 байта в конец структуры (так называемые padding bytes). Это приводит к тому, что размер структуры становится равен 8 и в памяти массив начинает располагаться так:
Однако, это ещё не всё, что делает с этой структурой компилятор. Кроме того, что размер Foo равен 8, компилятор также запоминает, что минимальное требование по выравниванию для всей этой структуры — 4 байта. Отличия легко показать на следующем примере:
struct Test1 <
char c;
Foo foo;
>;
Здесь интересны такие моменты: размер и Foo и Bar — одинаковый и равен 8-ми байтам. Но требования по выравниваю у Foo — 4 байта, а у Bar — 1. Это приводит к тому, что в структуре Test1, между ‘c’ и ‘foo’ компилятор вставляет дополнительных 3 байта, чтобы гарантировать, что поле ‘foo’ всегда будет начинаться по адресу, кратному 4-м. В структуре же Test2 ничего такого делать не надо, в результате — sizeof(Test1) равен 12, а sizeof(Test2) — 9. То есть получили разный результат, комбинируя «кирпичики» одного и того же размера!
Определить размер структуры
Нужно определить размер следующей структуры
Определить размер структуры
Здравствуйте. Как определить размер структуры без использования функции sizeof()?
Размер структуры
Помогите узнать размер структуры: enum UnitType < Swordsman, // мечник Archer, //.
вообще-то эти данные прицеплены к структуре (при записи в файл их размер будет иметь значение)
Добавлено через 8 минут
Не говори ерунды, эти данные находятся в памяти, выделенной динамически, и не могут быть записаны вместе с записью структуры.
Добавлено через 6 минут
не могут, но должны быть записаны
там может и не быть данных
надо определить размер всего, что относится к этой структуре
Добавлено через 2 минуты
я про размер структуры говорил (изначально)
её размер никак не может быть 4 или 8
Добавлено через 6 минут
Размер структуры
Добрый день! Дорогие форумчане, помогите если не трудно. такая проблема: есть структура.
Размер структуры
Всем доброго дня! Не могу понять. Вот код. struct T < char i; int a; int b; int c;.
StructLayout и размер структуры
Доброго времени суток. Подскажите, почему экземпляр структуры MyStruct занимает 4 байта, а.