адрес члена protobuf изменяется при использовании метода set? - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть такой протобуф

message Proto{
    string  Data = 1;
}

и я использую его вот так

Proto prot;
const s8* szData = prot.data().c_str();

меня смущает то, что когда я устанавливаю данные, кажется, что содержимое в szData нето же самое с prot.data (), и после некоторого теста я обнаружил, что адрес prot.data изменяется

, например, следующий код:

// original
cout << static_cast<const void *>(szData) << ":"
<< static_cast<const void *>(prot.data().c_str()) << endl;

// set for the first time
prot.set_data("11");
cout << static_cast<const void *>(szData) << ":"
<< static_cast<const void *>(prot.data().c_str()) << endl;

// set for the second time
prot.set_data("12");
cout << static_cast<const void *>(szData) << ":"
<< static_cast<const void *>(prot.data().c_str()) << endl;

выдаст что-то вроде этого:

0x63ef618:0x63ef618
0x63ef618:0x63ef318
0x63ef618:0x63ef618

szData также может быть наполнен каким-то бессмысленным контентом. Может ли кто-нибудь так любезно объяснить это мне?

1 Ответ

0 голосов
/ 03 декабря 2018

компилятор protobuf генерирует для вашего класса сообщений что-то вроде этого:

class ProtoClass {
  // getters
  const string& data() { return data; }

  // setters
  void set_data (const string& d) {
    data = d; // [1]
  }

  void set_data (string&& d) {
    data = move(d); // [2]
  }
  // other members

private:
  string data;
};

Существует разница между адресом данных для элемента данных ProtoClass (указатель на data) и указателем на содержимоестрока данных (что c_str() возвращает при вызове data.c_str()).

Каждый раз, когда вы вызываете set_data, вы изменяете data член, вызывая операторы копирования / перемещения ([1], [2]), эти операторы не изменяют адрес члена data, но они изменяют внутренний указатель строки данных.После каждого вызова set_data адрес строки, возвращаемой prot.data(), остается неизменным, set_data не выполняет никаких операций, которые могут изменить адрес этого объекта.Только содержимое строки изменяется, что вы наблюдали, печатая c_str() значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...