Я знаю, что значение данного this
не может быть определено во время компиляции.Мне остается только удивляться, что после того, как данный объект выделен и создан, кэшируется ли значение this
, или существует ли буквальная оценка выражения при каждом использовании?Вот конкретный пример, который мотивирует мой вопрос.Имейте в виду, что это нарушает все доктрины ООП и функции защиты, которые С ++ стремится поддерживать.
int main()
{
string s1 = string("I am super a super long string named s1, and won't be SSO");
string s2 = string("I am super a super long string named s2, and won't be SSO");
byte* s1interface = reinterpret_cast<byte*>(&s1);
byte* s2interface = reinterpret_cast<byte*>(&s2);
static_assert(sizeof s1 == sizeof s2);
for(int offset(0); offset < sizeof s1; ++offset)
{
*(s1interface + offset) ^= *(s2interface + offset);
*(s2interface + offset) ^= *(s1interface + offset);
*(s1interface + offset) ^= *(s2interface + offset);
}
cout << s1 << '\n' << s2 << "\n\n\n";
return 0;
}
//outputs:
//I am super a super long string **named s2**, and won't be SSO
//I am super a super long string **named s1**, and won't be SSO
//(The emphasis on the output strings was added by me to highlight the identity change)
Я хочу начать с того, что эта программа не только компилирует, но и вырабатывает этот вывод последовательно.Мой вопрос не основан на том, почему / как это работает.
На мой взгляд, любые внутренние переменные, даже те, которые управляют динамической памятью, будут трансплантированы, как только объекты будут (ре) правильно сформированы.,Тем не менее, я предполагаю гипотетический сценарий, в котором this
запрашивается объектом и затем сохраняется внутри.После операции по пересадке объекта &me
не будет совпадать с this
, который был запрошен и сохранен при первоначальной конструкции, что серьезно повредило бы любые операции, использующие this
, в сочетании с любым отражением адреса времени выполнения.Хотя это никогда не должно делаться, и все ставки не принимаются, если кто-то осмелится сделать что-либо настолько отвратительное с любым их объектом или иным образом, предписывает ли Стандарт постоянную оценку this
или просто для this
, чтобы выполнить то, что он говорит в соответствии спредположение, что объект будет занимать только место, где он помещен?
РЕДАКТИРОВАТЬ: Позвольте мне объяснить это по-другому, если во время выполнения объект имеет скрытый и внутренний this
, который записывается после его выделенияи все последующие чтения this
считывают сохраненное значение, после того, как &object
и this
пересадки не будут одинаковыми.Это явно не так, как это реализовано моим компилятором, но я хочу знать, является ли это соответствием или удачей.