2014-11-25 2 views
2

В реализации Visual Studio из type_info, обычно находятся в C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ включить \ TypeInfo:Может ли кто-нибудь объяснить этот доступ к границам без ограничений в библиотеке MSVC++ std?

class type_info { 
    /* ... */ 

    _CRTIMP_PURE bool __CLR_OR_THIS_CALL operator==(const type_info& _Rhs) const; 

    /* ... */ 

private: 
    void *_M_data; 
    char _M_d_name[1]; 
    __CLR_OR_THIS_CALL type_info(const type_info& _Rhs); 

    /* ... */ 

}; 

Я заметил, что выполнение оператора равенства == использует указатель на персонаж _M_d_name + 1. Может ли кто-нибудь объяснить мне, как это работает, потому что кажется, что это было бы вне границ массива?

Реализация, C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ элт \ SRC \ ti_inst.cpp:

ASSERT_UNMANAGED_CODE_ATTRIBUTE 
SECURITYSAFECRITICAL_ATTRIBUTE 
bool type_info::operator==(const type_info& rhs) const 
{ 
     return (strcmp((rhs._M_d_name)+1, (_M_d_name)+1)?0:1); 
} 

Спасибо!

+1

Это в основном способ написания переменной длины структуры. –

+3

Имейте в виду, что это является частью «реализации», которая также включает в себя компилятор и т. Д., Поэтому они могут свободно делать то, что им нравится, в том числе определять их использование неопределенного поведения .... –

+0

@ T.C. Спасибо за ваш комментарий. Есть ли шанс, что вы могли бы разработать немного? – trev

ответ

1

Этот трюк предназначен для гибкого элемента массива. Он будет выделять память для class type_info и строки имени, поэтому (rhs._M_d_name)+1 точно соответствует строке имени. Вот график, чтобы описать его:

 +------------+ --+   
     |   | |   
     +------------+    
     |   | |   
     |   | ->type_info 
     +------------+ |   
+-------+ _M_d_name | |   
|  +------------+ --+   
+------->   |    
     |   |    
     |   |    
     +------------+    

На самом деле, c99 поддерживает эту функцию и a Microsoft extension allows the last member of a C or C++ structure or class to be a variable-sized array

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