- 1
short someShort = (short) (someBoolean ? 15 : 42);
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+64
short someShort = (short) (someBoolean ? 15 : 42);
такая удобная Java
Lure Of Chaos 21.04.2014 16:53 # +3
short побъери!
evg_ever 21.04.2014 17:04 # 0
Lokich 21.04.2014 17:32 # −4
под short надо 2 байта, а под int 4.
guest 21.04.2014 17:37 # +4
Dummy00001 21.04.2014 20:29 # +2
но на локальные переменные это правило не распространяется. локальные переменные как правило выравнены по размеру своего типа, подобно как в структурах.
выравнивание стэка на 16 байт это ты скорее всего путаешь с выравниванием стэк фрэйма: размер параметров функции (как и суммарный размер локальных переменных) часто выравнивается на 16/32 байт. для того что бы cache line alignment был.
Abbath 21.04.2014 20:56 # 0
bormand 21.04.2014 21:10 # +1
WGH 21.04.2014 21:22 # +2
Dummy00001 22.04.2014 00:16 # +2
Dummy00001 22.04.2014 00:13 # 0
Abbath 22.04.2014 01:30 # 0
WGH 22.04.2014 02:02 # 0
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 же почему то перекладывает в локальную переменную нового фрейма, и берет уже её адрес.
WGH 22.04.2014 02:09 # 0
Linux clang 3.3 (x86_64 -m32) - 2
Во втором случае он решил не рисковать, и переложил обе переменные в новый фрейм. (В первом, очевидно, тоже, ибо в amd64 аргументы через регистры передаются, так что выгружать на стек в любом случае надо явно)
Dummy00001 22.04.2014 02:04 # +1
ХЕЗ. какая-то оптимизация того как аргументы на стек ложатся.
и 32 битного ABI под рукой нет что бы посмотреть в детали.
WGH 22.04.2014 02:06 # +5
Ололо, на говнокод.ру! Wait... oh shi~.
Dummy00001 22.04.2014 02:45 # 0
defecate-plusplus 22.04.2014 09:54 # 0
это в 14:00 чтоли?
Lure Of Chaos 22.04.2014 09:59 # +1
Abbath 22.04.2014 10:18 # +1
-В 6 дня
guest 22.04.2014 14:39 # 0
Abbath 22.04.2014 09:13 # 0
Lokich 21.04.2014 23:45 # 0
guest 22.04.2014 01:39 # +1
guest 22.04.2014 01:39 # 0
Почему?
Dummy00001 22.04.2014 01:50 # 0
локальные переменные: а почему бы и нет? в ABI так написано.
bormand 22.04.2014 05:21 # +2
Патамушта эти ваши ARM'ы в андроидах и айфонах и прочие не x86 не любят криво выровненные данные.
guest 22.04.2014 11:10 # 0
bormand 22.04.2014 12:04 # +1
guest 22.04.2014 13:58 # 0
bormand 22.04.2014 14:34 # 0
Lokich 22.04.2014 12:29 # 0
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.
3.14159265 22.04.2014 13:18 # 0
Шура, а сколько вообще инстансов типа 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-байтной границы.
bormand 22.04.2014 13:48 # +2
Он о шарпе же. Внимательней :)
3.14159265 22.04.2014 14:07 # 0
>boolean 1 byte
3.14159265 22.04.2014 14:13 # 0
Тоже пиздёж.
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:)
evg_ever 22.04.2014 13:39 # +1
Lokich 22.04.2014 14:04 # 0
defecate-plusplus 22.04.2014 14:06 # 0
bormand 22.04.2014 14:37 # 0
Lokich 22.04.2014 14:45 # 0
bormand 22.04.2014 14:49 # +5
roman-kashitsyn 22.04.2014 14:55 # 0
потому что там реализация дженериков другая - reified generics.
guest 22.04.2014 15:23 # 0
Lokich 22.04.2014 15:52 # 0
вообще непонятно, почему примитивы не могут быть в коллекциях
http://www.dotnetperls.com/int
roman-kashitsyn 22.04.2014 16:00 # +1
На досуге подумай или почитай, какие подходы можно использовать для реализации дженериков, какие последствия влечёт каждая реализация и какие требования к рантайму она предоватвляет.
guest 22.04.2014 17:01 # 0
roman-kashitsyn 22.04.2014 17:02 # 0
вопросик это сахар для Nullable<T> где T может быть любым примитивом.
Lokich 22.04.2014 17:21 # 0
>•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.
короче говоря, это только для структур сделано.
guest 22.04.2014 18:01 # 0
Lokich 23.04.2014 13:25 # 0
http://msdn.microsoft.com/en-us/library/ms228358(v=vs.90).aspx тут есть мануал для java программеров, как с c# соскочить
bormand 23.04.2014 13:36 # 0
Зачем соскакивать с решеток на жабу?!
Lokich 23.04.2014 14:37 # 0
guest 23.04.2014 13:39 # 0
Lokich 23.04.2014 14:37 # 0
думаю ты все и сам поймешь :)
guest 23.04.2014 14:46 # 0
roman-kashitsyn 23.04.2014 14:48 # +1
guest 23.04.2014 19:44 # 0
Роман, что-то знаешь, чего еще не знаю я? Молодец.
>примитивный тип в самом объекте
И это шарповые дженерики могут? Респект.
roman-kashitsyn 23.04.2014 19:49 # +1
да если бы, я на шарпе не пишу. Тут уже 5 раз разжевали, даже сорцы реализации привели.
guest 23.04.2014 19:53 # 0
bormand 23.04.2014 14:49 # 0
примитивный тип в самом объекте
Xom94ok 23.04.2014 19:28 # 0
Ничем. Короткий псевдоним, такой же как string для System.String
Lokich 24.04.2014 11:31 # 0
roman-kashitsyn 24.04.2014 11:35 # +1
bormand 22.04.2014 13:47 # +2
Потому что Boolean это объект, блджад! Со всеми вытекающими последствиями. Об него можно даже синхронизироваться при желании.
Еще не забывай про 4 байта на ссылку, которая на этот Boolean будет указывать.
Lokich 22.04.2014 11:13 # 0
bormand 22.04.2014 11:33 # +1
guest 22.04.2014 11:43 # −1
bormand 22.04.2014 12:04 # +1
Потому что переменные внутри фрейма можно разложить поплотнее, если мы знаем, что фрейм выровнен на 16 байт.
guest 22.04.2014 13:59 # −2
Lokich 22.04.2014 14:17 # +1
http://konishchevdmitry.blogspot.fr/2010/01/blog-post.html тут я думаю понятно написано
bormand 22.04.2014 15:08 # +4
Lokich 22.04.2014 15:27 # 0
guest 22.04.2014 17:02 # 0
поехавший.jpg
guest 22.04.2014 15:22 # −2
bormand 22.04.2014 15:27 # +3
Я ж не со зла писал "тебе - не нужно, ты же не байтоёб-сишник какой-нибудь". Оно действительно не нужно, пока не начинаешь заниматься байтоёбством :)
guest 22.04.2014 17:03 # −3
Abbath 22.04.2014 19:31 # 0
guest 23.04.2014 14:49 # 0
bormand 23.04.2014 15:06 # +2
Да и в 99% случаев на выравниваниях ты много не выиграешь. Ссылки, системная инфа в объектах, кишки коллекций и т.п. всяко больше жрут.
guest 23.04.2014 15:15 # 0
bormand 23.04.2014 15:30 # 0
Ну а в массив ты сможешь пихать только примитивы и структуры (если мы о шарпе). Примитивы в массивах всегда будут лежать плотно, без выравниваний. Вот и остается только массив мелких структур, в которых ты юзаешь типы разных размеров (например byte и int), тот самый 1% :)
P.S. Кстати, а шарп имеет право менять местами поля в структурах/классах? Если да - то он и тут все сделает за тебя, и выиграть на выравниваниях уже ничего не получится...
guest 23.04.2014 15:34 # 0
>тот самый 1% :)
Но это вполне реальный случай
bormand 23.04.2014 15:37 # 0
Я не уверен, но это скорее всего будет массив из ссылок на объекты.
> Но это вполне реальный случай
Ну как сказать... Разве что в каких-то вычислительных задачах. Может быть еще в векторной графике.
P.S. Один хрен, больше чем вдвое структура от выравнивания не растянется.
guest 23.04.2014 15:49 # 0
А ну да. Но все же.
Хватит меня отговаривать :) Иди лучше SRP настрой.
Lokich 23.04.2014 16:36 # 0
структуры по сути памяти вообще занимают копейки.
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
Lokich 23.04.2014 16:31 # 0
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
bormand 23.04.2014 17:53 # 0
Это не совсем то... Я не о порядке записи в поля, а о порядке полей в самой структуре.
Lokich 24.04.2014 11:34 # 0
Lokich 24.04.2014 11:40 # 0
Lokich 22.04.2014 15:46 # 0
как-то так.
guest 22.04.2014 17:03 # −1
Lokich 22.04.2014 17:29 # 0
и так далее
в данном случае будет 10 байт, но зарезервирует 12, так как страницы по 4 байта.
чет я сам запутался уже, почему до 16 выравнивать надо :)
просто надо учитывать, что чем больше объектов ты будешь создавать, тем больше зарезервированных дырок в памяти у тебя будет, и тем больше раз нужно будет запрашивать страницы из памяти
guest 22.04.2014 17:55 # −1
То-то и оно. Сам разберись сначала.
WGH 22.04.2014 17:55 # +1
Выравнивание и padding зависит по большей части от того, что там внутри DateType лежит.
guest 22.04.2014 17:56 # −1
WGH 22.04.2014 17:57 # 0
guest 22.04.2014 18:00 # −1
WGH 22.04.2014 18:08 # 0
guest 22.04.2014 18:22 # −1
WGH 22.04.2014 18:25 # 0
guest 22.04.2014 18:51 # −1
WGH 22.04.2014 18:57 # 0
guest 22.04.2014 19:08 # −1
Abbath 22.04.2014 19:31 # −1
guest 22.04.2014 20:08 # +1
bormand 22.04.2014 14:38 # +3
Lokich 22.04.2014 14:56 # 0
http://www.dotnetperls.com/struct раздел Allocation performance
guest 22.04.2014 15:21 # −7
bormand 22.04.2014 16:07 # +3
Нафуя ее доставать? Вывод перенаправил в /dev/null да и все.
guest 22.04.2014 17:02 # −2
Abbath 22.04.2014 19:33 # +1
LispGovno 22.04.2014 19:35 # 0
Почему мне кажется, что этот пациент из старых на гк под другим ником?
Abbath 22.04.2014 19:36 # 0
3.14159265 22.04.2014 20:16 # +4
И не с двачей, а с сосачей.
guest 22.04.2014 22:10 # 0
3.14159265 22.04.2014 20:17 # +2
anonimb84a2f6fd141
Таким?
И кто для пользователя с id>6000 "старые на гк":?
guest 22.04.2014 22:10 # 0
Dummy00001 21.04.2014 20:31 # 0