HD86_ Ответов: 1

Существует ли разница в стоимости между разыменованием всего объекта кучи и только некоторых его членов?


Есть ли разница в стоимости между инициализацией A и B в следующем коде?

int main() 
{
   Class* pClass = new Class;
   Class A = *pClass; //All heap object is dereferenced.
   auto B = (*pClass).member; //Is all heap object dereferenced or just the member?
}


Инициализация A приведет к разыменованию всего объекта, на который указывает pClass, что означает, что все его члены будут скопированы из кучи в стек. Происходит ли то же самое при инициализации B? Или инициализация B менее затратна, потому что только один член объекта будет разыменован?

Еще один похожий вопрос:

class Thing
{
public:
   Class1 member1;   
   Class2 member2;   
   Class3 member3;

   Class1 foo() 
   {
      return member1;
   }
};

int main() 
{
    Thing* pThing = new Thing;
    Thing A = *pThing; //All heap object is dereferenced.
    Class1 B = pThing->foo(); //Is the heap object entirely dereferenced?
}


В приведенном выше коде является ли инициализация B менее дорогостоящей, чем инициализация A? Поскольку функция foo имеет дело только с одним членом.

Что я уже пробовал:

Ничего....... Неприменимый.......

Afzaal Ahmad Zeeshan

Зачем вообще это делать? Вы можете рассмотреть возможность использования семантики копирования или перемещения, если это необходимо, и если вам нужно получить доступ к данным для целей чтения, почему бы не получить прямой доступ через указатель?

Объясните немного, чтобы мы могли вам помочь.

1 Ответов

Рейтинг:
8

OriginalGriff

Цитата:
Инициализация A приведет к разыменованию всего объекта, на который указывает pClass, что означает, что все его члены будут скопированы из кучи в стек. Происходит ли то же самое при инициализации B? Или инициализация B менее затратна, потому что только один член объекта будет разыменован?

Нет, это не так!
Разыменование указателя нигде ничего не копирует: и уж точно не в стек! Подумайте об этом: куча составляет несколько ГБ, каждый стек, вероятно, около 1 Мб или меньше. Вы не можете разыменовать указатель и скопировать объект в стек. Все, что происходит, когда вы разыменовываете указатель, - это то, что вы "следуете за ним" к целевому элементу.

Представьте указатель как индекс в книге: вы смотрите "CodeProject" в индексе, и он говорит: "страница 123, строка 14, Слово 6". Вы открываете книгу на странице 123, отсчитываете строки до 14, затем считаете слова до 6, и там есть слово "CodeProject". Вы не скопировали книгу целиком или частично - вы просто разыменовали указатель индекса, чтобы добраться до элемента данных.