2016-11-24 4 views
1

Мне было интересно, если я возьму адрес полностью статического класса, я гарантирую, что его члены будут выровнены в правильном порядке? Я предполагаю, что это относится и к группе переменных, определенных в глобальном масштабе.Стабильные переменные гарантируются, если я возьму его адрес?

struct Buffer1 
{ 
    static float val1; 
    static float val2; 
}; 

void readBuffer(void* buffer){ /*Do something*/} 

int main() 
{ 
// Sending the buffer 
    readBuffer(&Buffer1);    // Type name is not allowed 
    readBuffer(&Buffer1::val1);   // Does work, wondering if data will be correct 

    return 0; 
} 

Кроме того, существует ли способ взять размер группы статических или глобальных переменных? Как:

// Getting the size of the buffer 
    size_t sizeOfBuffer = sizeof(Buffer1); // Wrong size, doesn't measure static members 
    sizeOfBuffer = sizeof(Buffer1::val1) + sizeof(Buffer1::val2); // Does work but doesn't account for data padding/alignment, and is also tedious to change 

Я знаю, что в этом случае гораздо лучше работать с инстанцированием класса, но мне интересно об этих двух вопросах. Благодарю.

+2

Просто поместите эти переменные в структуру –

+1

Вы также столкнетесь с проблемами заполнения структуры. Вы не можете сделать 'struct Buffer1 {float val1, val2; }; static buffer Buffer1 buffer1 ;, вместо этого вы можете избежать, по крайней мере, проблемы 'sizeof'. –

+0

@Ken Y-N Да, определенно, это то, что у меня есть. Мне просто интересно, я изучаю все аспекты языка и пытаюсь понять, что я могу сделать со статической структурой. – Zebrafish

ответ

2

Нет, стандарт C++ не задает порядок объектов в памяти в статическом масштабе.

Также стандарт C++ не гарантирует относительный порядок членов класса.

+0

C++ 11 гарантирует, что элементы данных нестатического класса в пределах одного элемента управления доступом упорядочиваются последовательно в памяти. – doug

+0

@doug Интересно. Извините, я не знаком с «тем же контролем доступа». Означает ли это в той же области? Итак, перечислены последовательно в классе или последовательно в глобальном пространстве? – Zebrafish

+1

@TitoneMaurice: объявленные переменные, разделенные частным, общедоступным, защищенным, не обязательно должны соответствовать стандарту. Переменные упорядочиваются последовательно между этими спецификаторами доступа, хотя возможно с дополнением. – doug