- 1
short someShort = (short) (someBoolean ? 15 : 42);
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+64
short someShort = (short) (someBoolean ? 15 : 42);
такая удобная Java
short побъери!
под short надо 2 байта, а под int 4.
но на локальные переменные это правило не распространяется. локальные переменные как правило выравнены по размеру своего типа, подобно как в структурах.
выравнивание стэка на 16 байт это ты скорее всего путаешь с выравниванием стэк фрэйма: размер параметров функции (как и суммарный размер локальных переменных) часто выравнивается на 16/32 байт. для того что бы cache line alignment был.
FreeBSD clang 3.3 (x86_64 -m32) - КРОВЬ КИШКИ skipping incompatible /usr/lib/libc++.so.1 when searching for /usr/lib/libc++.so.1 (я не ставил пакета совместимости с x86, увы)
Linux gcc 4.7.3 (x86_64) - 4
Linux gcc 4.7.3 (x86_64 -m32) - 20
Немного переписал пример, и посмотрел, что происходит в асме:
Короче, для инта в качестве адреса он берет адрес параметра на стеке. Short же почему то перекладывает в локальную переменную нового фрейма, и берет уже её адрес.
Linux clang 3.3 (x86_64 -m32) - 2
Во втором случае он решил не рисковать, и переложил обе переменные в новый фрейм. (В первом, очевидно, тоже, ибо в amd64 аргументы через регистры передаются, так что выгружать на стек в любом случае надо явно)
ХЕЗ. какая-то оптимизация того как аргументы на стек ложатся.
и 32 битного ABI под рукой нет что бы посмотреть в детали.
Ололо, на говнокод.ру! Wait... oh shi~.
это в 14:00 чтоли?
-В 6 дня
Почему?
локальные переменные: а почему бы и нет? в ABI так написано.
Патамушта эти ваши ARM'ы в андроидах и айфонах и прочие не x86 не любят криво выровненные данные.
http://java-performance.info/overview-of-memory-saving-techniques-java/
byte, boolean 1 byte
short, char 2 bytes
int, float 4 bytes
long, double 8 bytes
Byte, Boolean 16 bytes
Short, Character 16 bytes
Integer, Float 16 bytes
Long, Double 24 bytes
я кстати может чего-то не понимаю, но нахера 16 байт под булевой тип? или я хрень какую-то нашел? :)
в шарпике
A Boolean value occupies one byte of memory. The byte's low-order bit is used to represent its value. A value of 1 represents true; a value of 0 represents false.
Шура, а сколько вообще инстансов типа Boolean вам нужно для счастья?
Аlignment.
>boolean 1 byte
>A Boolean value occupies one byte of memory. The byte's low-order bit is used to represent its value.
Это пиздёж. Зависит строго от JVM и как boolean выглядит, если массив - будут биты, в классе надо доравнять до 8-байтной границы.
Он о шарпе же. Внимательней :)
>boolean 1 byte
Тоже пиздёж.
A bool is actually only 1 byte, but alignment may cause 4 bytes to be used on a 32-bit platform, or even 8 bytes on a 64-bit platform. For example, the Nullable<bool> (aka bool?) type uses a full 32 or 64 bits—depending on platform—even though it's comprised of just two bools. EDIT: As pointed out by Jon Skeet, padding for alignment isn't always present. As an example, an array of Nullable<bool>s takes only 2 bytes per object instead of 4 or 8.
http://stackoverflow.com/questions/294905/why-in-net-system-boolean-takes-4-byte
The caveat is that when *marshalling* Bools are defined to be 32bits, i.e. 4bytes.
bool b=false; Console.WriteLine(System.Runtime.Interop Services.Marshal.SizeOf(b).ToString());
it prints 4 byte:)
потому что там реализация дженериков другая - reified generics.
вообще непонятно, почему примитивы не могут быть в коллекциях
http://www.dotnetperls.com/int
На досуге подумай или почитай, какие подходы можно использовать для реализации дженериков, какие последствия влечёт каждая реализация и какие требования к рантайму она предоватвляет.
вопросик это сахар для Nullable<T> где T может быть любым примитивом.
>•Value types
>These are the built-in primitive data types, such as char, int, and float, as well as user-defined types declared with struct.
>•Reference types
>Classes and other complex data types that are constructed from the primitive types. Variables of such types do not contain an instance of the type, but merely a reference to an instance.
>Nullable<T>
>Тип называется допускающим значение NULL, если ему может быть присвоено как непустое значение, так и значение null, означающее, что значение у типа отсутствует. По умолчанию все ссылочные типы, например String, допускающих значение NULL, но все типы значений, например Int32, нет.
>В C# и Visual Basic, в случае тип значения в качестве обнуляемой нотация ? после типа значения. Например, int? в C# в объявляет тип целого числа, можно присвоить null.
короче говоря, это только для структур сделано.
http://msdn.microsoft.com/en-us/library/ms228358(v=vs.90).aspx тут есть мануал для java программеров, как с c# соскочить
Зачем соскакивать с решеток на жабу?!
думаю ты все и сам поймешь :)
Роман, что-то знаешь, чего еще не знаю я? Молодец.
>примитивный тип в самом объекте
И это шарповые дженерики могут? Респект.
да если бы, я на шарпе не пишу. Тут уже 5 раз разжевали, даже сорцы реализации привели.
примитивный тип в самом объекте
Ничем. Короткий псевдоним, такой же как string для System.String
Потому что Boolean это объект, блджад! Со всеми вытекающими последствиями. Об него можно даже синхронизироваться при желании.
Еще не забывай про 4 байта на ссылку, которая на этот Boolean будет указывать.
Потому что переменные внутри фрейма можно разложить поплотнее, если мы знаем, что фрейм выровнен на 16 байт.
http://konishchevdmitry.blogspot.fr/2010/01/blog-post.html тут я думаю понятно написано
поехавший.jpg
Я ж не со зла писал "тебе - не нужно, ты же не байтоёб-сишник какой-нибудь". Оно действительно не нужно, пока не начинаешь заниматься байтоёбством :)
Да и в 99% случаев на выравниваниях ты много не выиграешь. Ссылки, системная инфа в объектах, кишки коллекций и т.п. всяко больше жрут.
Ну а в массив ты сможешь пихать только примитивы и структуры (если мы о шарпе). Примитивы в массивах всегда будут лежать плотно, без выравниваний. Вот и остается только массив мелких структур, в которых ты юзаешь типы разных размеров (например byte и int), тот самый 1% :)
P.S. Кстати, а шарп имеет право менять местами поля в структурах/классах? Если да - то он и тут все сделает за тебя, и выиграть на выравниваниях уже ничего не получится...
>тот самый 1% :)
Но это вполне реальный случай
Я не уверен, но это скорее всего будет массив из ссылок на объекты.
> Но это вполне реальный случай
Ну как сказать... Разве что в каких-то вычислительных задачах. Может быть еще в векторной графике.
P.S. Один хрен, больше чем вдвое структура от выравнивания не растянется.
А ну да. Но все же.
Хватит меня отговаривать :) Иди лучше SRP настрой.
структуры по сути памяти вообще занимают копейки.
Class version
Size of List: 1 object 512 KB
Size of internal array: 100000 objects 3.8 MB
Struct version
Size of List: 1 object 24 bytes
Size of internal array: 1 object 4.0 MB
про структуры можно тут почитать http://www.dotnetperls.com/struct
http://msdn.microsoft.com/en-us/magazine/jj863136.aspx
If _data and _initialized are ordinary (that is, non-volatile) fields, the compiler and the processor are allowed to reorder the operations so that Init executes as if it were written like this...
Volatile Fields The C# programming language provides volatile fields that constrain how memory operations can be reordered. The ECMA specification states that volatile fields provide acquire-release semantics
Это не совсем то... Я не о порядке записи в поля, а о порядке полей в самой структуре.
как-то так.
и так далее
в данном случае будет 10 байт, но зарезервирует 12, так как страницы по 4 байта.
чет я сам запутался уже, почему до 16 выравнивать надо :)
просто надо учитывать, что чем больше объектов ты будешь создавать, тем больше зарезервированных дырок в памяти у тебя будет, и тем больше раз нужно будет запрашивать страницы из памяти
То-то и оно. Сам разберись сначала.
Выравнивание и padding зависит по большей части от того, что там внутри DateType лежит.
http://www.dotnetperls.com/struct раздел Allocation performance
Нафуя ее доставать? Вывод перенаправил в /dev/null да и все.
Почему мне кажется, что этот пациент из старых на гк под другим ником?
И не с двачей, а с сосачей.
anonimb84a2f6fd141
Таким?
И кто для пользователя с id>6000 "старые на гк":?