2016-12-19 12 views
0

Необходимо создать уникальные ключи для членов данных класса. Поэтому я думаю о том, чтобы получить разницу между адресом переменной минус адрес объекта класса. Например:Каков наилучший способ получить разницу адресов между переменной класса и стартовым адресом объекта класса?

struct X { 
    int i; // &i - &X() = 0 (GCC) 
    double d; // &d - &X() = 8 (GCC) 
}; 

Это один раз упражнение и, следовательно, будет происходить в самом начале кода для всех заинтересованных классов. Таким образом, я обычно объявляю фиктивный объект класса и нахожу разницу в адресах путем типизации. Такие как:

X x; 
keyOf_i = long(&x.i) - long(&x); 
keyOf_d = long(&x.d) - long(&x); 

Есть ли лучший способ?
Предположим, что спецификатор доступа (private) не является проблемой.

Будет также интересно, если у кого-то есть другой подход к созданию уникальных ключей для переменных данных класса, кроме этого.


Update: С помощью offseof() макросов, я получаю следующее предупреждение в G ++ - 6:

offsetof в типе нестандартного макета 'MyClass' не определен

На самом деле у меня есть строка & других переменных класса, а также внутри MyClass. Я в порядке, даже если эта неопределенная вещь дает уникальный адрес. Однако хотелось бы получить дополнительную информацию от offsetof() и других альтернатив.

+0

@iammilind Я не могу думать о разностной ответ, 'offsetof' не определено поведение для не стандартной раскладки – Danh

+0

@SamVarshavchik, Danh может вы подробнее на «стандартные типы макетов». В каких ситуациях эта разница может потерпеть неудачу? Я думал, что разница между адресом объекта класса и адресом его члена данных всегда остается постоянной. Когда это различие станет неопределенным? Кстати, меня не интересует точная разница как таковая. Скорее, меня просто интересует уникальная разница для всех переменных класса. Пожалуйста, предложите. – iammilind

+0

Google для «указателя на член». Указатель-к-член - это то, что позволяет вам получить доступ к некоторому члену экземпляра структуры или класса, если вы также указали на экземпляр. – gnasher729

ответ

1

Как насчет использования макроса offsetof() для этого. Проверьте http://man7.org/linux/man-pages/man3/offsetof.3.html для более подробной информации.

Пример кода ниже описывается на странице:

#include <stddef.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    struct s { 
     int i; 
     char c; 
     double d; 
     char a[]; 
    }; 

    /* Output is compiler dependent */ 

    printf("offsets: i=%ld; c=%ld; d=%ld a=%ld\n", 
      (long) offsetof(struct s, i), 
      (long) offsetof(struct s, c), 
      (long) offsetof(struct s, d), 
      (long) offsetof(struct s, a)); 
    printf("sizeof(struct s)=%ld\n", (long) sizeof(struct s)); 

    exit(EXIT_SUCCESS); 
} 

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

  • Нет связанных вопросов^_^