|
Development Development |
|
Опции темы | Поиск в этой теме | Опции просмотра |
29.08.2012, 01:41 | #1 |
MaNGOS Dev
Регистрация: 17.11.2011
Сообщений: 99
Сказал(а) спасибо: 35
Поблагодарили 80 раз(а) в 26 сообщениях
|
return-by-reference for Object field access
Can somebody explain why we use return-by-reference to access object-fields?
Код:
const int32& GetInt32Value(uint16 index) const { MANGOS_ASSERT(index < m_valuesCount || PrintIndexError(index , false)); return m_int32Values[ index ]; } const uint32& GetUInt32Value(uint16 index) const { MANGOS_ASSERT(index < m_valuesCount || PrintIndexError(index , false)); return m_uint32Values[ index ]; } const uint64& GetUInt64Value(uint16 index) const { MANGOS_ASSERT(index + 1 < m_valuesCount || PrintIndexError(index , false)); return *((uint64*) & (m_uint32Values[ index ])); } const float& GetFloatValue(uint16 index) const { MANGOS_ASSERT(index < m_valuesCount || PrintIndexError(index , false)); return m_floatValues[ index ]; } uint8 GetByteValue(uint16 index, uint8 offset) const { MANGOS_ASSERT(index < m_valuesCount || PrintIndexError(index , false)); MANGOS_ASSERT(offset < 4); return *(((uint8*)&m_uint32Values[ index ]) + offset); } uint16 GetUInt16Value(uint16 index, uint8 offset) const { MANGOS_ASSERT(index < m_valuesCount || PrintIndexError(index , false)); MANGOS_ASSERT(offset < 2); return *(((uint16*)&m_uint32Values[ index ]) + offset); } ObjectGuid const& GetGuidValue(uint16 index) const { return *reinterpret_cast<ObjectGuid const*>(&GetUInt64Value(index)); } (Historical note: we do this since long forgotten times) |
29.08.2012, 02:12 | #2 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
A discussion of a different yet related matter:
https://github.com/mangos/server/com...omment-1673031 |
29.08.2012, 03:05 | #3 |
MaNGOS Dev
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
|
Code inlined and in result this is array access. For small size types i think no difference, it's just consistent with way how this used for large structures access for avoid copy constructor call.
__________________
Так как устал объяснять знайте ICQ не пользуюсь |
Пользователь сказал cпасибо: | Foks (02.09.2012) |
29.08.2012, 06:48 | #4 |
MaNGOS Dev
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
|
I always pass POD types by value if they fit into 64-bit register.
As some people here said in theory compiler can optimize out access by reference but no one proved that average compiler can into such stuff. Same with 'const'. I heard it can lead to better optimization by compiler but no one have real examples. Последний раз редактировалось zergtmn; 29.08.2012 в 07:30. |
29.08.2012, 09:32 | #5 |
MaNGOS Dev
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
|
Maybe you right, i not have personal strong points against use return values instead refs for types fit to 64-bits.
__________________
Так как устал объяснять знайте ICQ не пользуюсь |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
ошибка компиляции (undefined reference to `__sync_add_and_fetch_4') | maximt | Установка MaNGOS | 6 | 16.01.2011 21:13 |
[10065] Some return values fixes. | newsbot | CMaNGOS Commits | 0 | 15.06.2010 19:20 |
Added missing return statement. | newsbot | CMaNGOS Commits | 0 | 15.06.2010 16:10 |
[9575] Use ObjectGuid in Map object stores/world access/search. | newsbot | CMaNGOS Commits | 0 | 12.03.2010 13:40 |