В началото на моите C++ дни (преди доста време) бях заобиколен от Java академици. Когато ме попитаха за предимството на C++ пред Java (обикновено въпрос, който се опитвам да отхвърля като измислен, но ето го), бих включил в отговора си, че C++ ви дава препратки и указатели. Момчетата от Java биха изглеждали недоверчиви и биха предположили, че препратките са указатели, и ме изкараха със смях от стаята. Настоях, че препратките и указателите са различни в C++.
И за да бъда честен, бях прав. Препратките и указателите са различни семантично и синтактично. За съжаление, подкрепих твърдението си с една заблуда: че основната реализация е различна.
Твърдото ми убеждение беше, че референциите са, според стандартизацията, псевдоними на имена в синтаксиса по същия начин, по който typedef
е псевдоним на тип без съхранение.
Бях сигурен, че референциите не са обекти и нямат място за съхранение, че те просто предоставят множество съпоставяния от най-високо ниво на „име“ към „обект“. В това отношение си помислих, че те са като меки връзки във файлова система:
Code: int a = 3; int& b = a;
Names Objects Memory
+-----+ +-------------+ +-------+
| a |---->| | | |
+-----+ | | | |
| int |---->| 3 |
+-----+ | | | |
| b |---->| | | |
+-----+ +-------------+ +-------+
Разбира се, въпреки че оптимизациите могат да доведат до това, референциите имат място за съхранение. Те са отделни обекти, дори ако синтаксисът прави всичко възможно да ги абстрахира от програмиста.
Достатъчно е да кажа, че бях разочарован да науча, че компилатор с изключени оптимизации може да имплементира препратка като указател, изискващ операция за дерефериране: че всъщност създавах аналогията с твърда връзка в файлова система:
Code: int a = 3; int& b = a;
Names Objects Memory
+-----+ +-------------+ +-------+
| a |---->| int |---->| |
+-----+ +-------------+ | |
| 3 |
+-----+ +-------------+ | |
| b |---->| int& |---->| |
+-----+ +-------------+ +-------+
Стандартният C++ всъщност не уточнява как референциите трябва да бъдат реализирани, така че моята теория може да е вярна за някои вериги от инструменти, но не е в нито един масов компилатор... и със сигурност не е посочено в стандарта.
person
Community
schedule
23.03.2011