Порядок данных в памяти - PullRequest
       1

Порядок данных в памяти

5 голосов
/ 11 августа 2010

Несколько простых вопросов.

const int gFirst;
const int gSecond;

struct Data
{
    static int First;
    static int Second;

    int first;
    int second;
};

Data data;

Гарантируется ли, что следующие утверждения верны?

  1. &gFirst < &gSecond
  2. &Data::First < &Data::Second
  3. &data.first < &data.second

Ответы [ 2 ]

8 голосов
/ 11 августа 2010

1) Этот результат не указан.
2) Этот результат не указан. *
3) Да.

Соответствующий раздел в стандарте - §5.9 / 2. Реляционные сравнения между указателями p и q указываются только тогда, когда:

  • p и q указывают на один и тот же объект или функцию, указывают на один конец конца одного и того же массива, или оба имеют нулевое значение. В этом случае p <= q и p >= q являются истинными, а p < q и p > q ложными.
  • p и q указывают на нестатические элементы данных одного и того же объекта, указатель на объявленный позже элемент сравнивается больше. (Обратите внимание, что это сравнение не может быть между спецификаторами доступа.)
  • p и q указывают на элементы в одном и том же массиве или на один конец конца массива, указатель на элемент с более высоким индексом или на один конец конца массива сравнивается больше.
  • p и q указывают на элементы данных одного и того же объекта объединения, и в этом случае они сравниваются одинаково.

Во всех остальных случаях результат не указан.

* Поскольку они статичны, они (очевидно) не получают правил "нестатического члена". Они будут определены в некоторой единице перевода, и, следовательно, как и любой другой указатель. (Неопределенные.)


Примечание! Существует способ получить общее упорядочение, используя std::less<void*> (и все другие объекты сравнительных функций.)

Это в §20.3.3 / 8:

Для шаблонов greater, less, greater_equal и less_equal, специализации для любого Тип указателя выдает суммарный порядок, даже если встроенные операторы <, >, <=, >= не делают.

Так что, пока вы не знаете, std::less<void*>(&gFirst, &gSecond) равно true или false, вам гарантировано:

std::less<void*>(&gFirst, &gSecond) ==
    std::greater<void*>(&gSecond, &gFirst);
std::less<void*>(&Data::First, &Data::Second) ==
    std::greater<void*>(&Data::Second, &Data::First);

Что может оказаться полезным.

6 голосов
/ 11 августа 2010

Ответ:

1) Not guaranteed.
   But probably.
   But the order of initialization is guaranteed.
2) No. 
   You just have the declaration here.  
   You need to to define the instances in a source file.
   Then they will behave the same way as the objects in (1).
3) Yes.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...