2016-02-14 7 views
2
julia> type TestA 
     a::Int32 
     b::Int64 
     end 
julia> type TestB 
     a::Int64 
     b::Int64 
     end 

julia> sizeof(TestA),sizeof(TestB) 
(16,16) 

Я исхожу, что sizeof(TestA) будет 4 + 8 = 12.Принцип двоичного представления типов данных в Julia


Мне любопытно узнать принцип за кулисами.

Почему TestA и TestB имеют такой же размер?

пс: http://docs.julialang.org/en/latest/devdocs/object/ хороший материал

+4

Я незнаком с Джулией, но я подозреваю, что это байт. Например, если вы определяете 'struct' в C или C++, который содержит' uint8_t' и 'uint32_t', вы обнаружите, что на большинстве плат требуется 64 байта памяти, если вы не используете директивы, чтобы настаивать на размерах , –

+0

Обходное решение - переопределить Base.size: 'size (x :: TestA) = sizeof (xa) + sizeof (xb)', если вы хотите – Gnimuc

+1

Я не уверен, но я думаю, что @DavidHoelzer прав, поскольку [ документация] (http://docs.julialang.org/en/release-0.4/devdocs/object/#object-allocation) говорит: 'Обратите внимание, что все объекты распределяются в кратных 4 байтах и ​​выравниваются с размером указателя платформы. . Если вам нужны упакованные структуры, вы можете попробовать: [StrPack] (https://github.com/pao/StrPack.jl#strpack-structured-binary-stream-tools) – Gomiero

ответ

7

выравнивание Byte является ответом. В документации указывается, что:

Обратите внимание, что все объекты распределены кратным 4 байтам и выровнены с размером указателя платформы.

+4

В целом, Julia пытается сопоставить правила выравнивания C-структуры так что вы можете зеркалировать структуры C в Julia и передавать значение взад и вперед. – StefanKarpinski

Смежные вопросы