2013-02-20 2 views
4

У меня есть прежде всего фон на C++. Я отслеживал ошибку в коде SystemVerilog, над которым я работаю, и был удивлен, обнаружив, что, по моему мнению, назначение копирования объектов было на самом деле ссылочным назначением. Этот упрощенный код показывает, что я имею в виду:Назначение SystemVerilog vs C++: ссылка или копия?

for (int i = 0; i < max_num; ++i) 
{ 
    var cls_obj obj1; 
    obj1 = obj_array[i]; 

    some_function(obj1); // modifies the object passed in 

    // at this point BOTH obj1 and obj_array[i] are modified. 

    // some other code goes here 
} 

я ожидал только obj1 быть изменены. Это из-за ключевого слова var? Как именно копирование по сравнению с назначением ссылок работает в SystemVerilog? Мне сложно найти информацию из веб-поиска.

+0

У вас есть доступ к LRM IEEE 1800-2009? Это очень ясно объясняется в главе 8.11. – dwikle

+0

Эй, черви, я на самом деле. Я нашел его онлайн, но он стоит денег. Возможно, мне придется проверить со своими коллегами, чтобы узнать, есть ли у нас. Спасибо, что сообщили мне об этом. – Rich

+0

FYI, версия LRM 2012 года теперь доступна онлайн для бесплатной загрузки здесь: http://standards.ieee.org/getieee/1800/download/1800-2012.pdf – dwikle

ответ

6

Переменные класса в SystemVerilog являются ссылками или дескрипторами. Экземпляры создаются только при использовании ключевого слова new.

Итак, в вашем примере obj1 и obj_array[i] оба ссылаются (или указывают) на тот же экземпляр.

По умолчанию параметры функции в SystemVerilog передаются по значению. Однако дескрипторы классов рассматриваются как значения, поэтому любой класс, который вы передаете в функцию, эффективно передается по ссылке.

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

Packet p1; 
Packet p2; 
p1 = new; 
p2 = new p1; 

Это делает мелкую копию. Для объектов копируются только ручки!

Это объясняется примерами в главе 8.11 IEEE 1800-2009.

Ключевое слово var не имеет никакого отношения к поведению, которое вы видите. На самом деле, я даже не видел и не использовал var. Согласно LRM это позволяет опустить тип при объявлении переменной. В вашем коде указан тип (cls_obj), поэтому я не думаю, что его присутствие что-то делает.

+2

Отлично, спасибо! В этом отношении кажется гораздо более похожим на Java, чем на C++. – Rich

+0

var означает «это объявление переменной». Его можно опустить почти всегда, потому что это подразумевается. Есть исключения, но они неясны. Я только однажды использовал «var». –

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

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