2014-11-26 2 views
1

, если у меня есть структура:ли станд :: BITSET гарантирует непрерывную память наряду с постоянным размером в структуре (чтобы избежать отступов?)

struct foo 
{ 
    int ibar; 
    std::bitset<32> bsbar; 
    float fbar; 
}; 

не делает BITSET гарантии не будет никакой обивки байт между ibar и bsbar и что размер этой структуры всегда будет 12 (для использования в операциях memcpy)?

+2

'bitet' или нет, ответ на вопрос« гарантированно, что у X байтов заполнения »всегда нет. Реализации разрешено добавлять байты заполнения по любой причине или по какой-либо причине, по прихоти, пока сохраняются требования к выравниванию. –

ответ

1

Нет, и вы должны сначала протестировать и посмотреть, что ответ может быть:

#include <iostream> 
#include <bitset> 

struct foo 
{ 
    int ibar; 
    std::bitset<32> bsbar; 
    float fbar; 
}; 

int main(int argc, char const *argv[]) 
{ 
    std::cout << sizeof(foo) << std::endl; // 24 on my machine (OS X 10.10 g++4.9.2 64 bit) 
} 
+2

Но это выходит как 12 на [наименее одной платформе] (http://ideone.com/Oa7TYX). Поэтому, если это платформа, на которой вы тестируете, это не помогло бы вообще определить, что общего. –

+0

Я просто говорю, что ответ «всегда будет 12» отрицателен, не более того. Как @ T.C. упомянутый, компилятору разрешено выполнять прописку, если вы специально не указали выравнивание. – vsoftco

+0

@vsoftco вы имеете в виду #pragma pack? – Gizmo

1

В классе, может быть неназванным набивка между любым членом, который занимает места целые памяти, единственным исключением является первым член стандартной верстки структуры:

If a standard-layout class object has any non-static data members, its address is the same as the address of its first non-static data member. Otherwise, its address is the same as the address of its first base class subobject (if any). [ Note: There might therefore be unnamed padding within a standard-layout struct object, but not at its beginning, as necessary to achieve appropriate alignment. — end note ]

Реализация позволяет «упаковать» через ПРАГМАС структуры или флаги компилятора. GCC распознает pack attribute.