gpt4 book ai didi

c++ - C++ 中 "this"关键字的实现限制,因为它涉及危险但功能示例

转载 作者:行者123 更新时间:2023-11-30 02:18:17 27 4
gpt4 key购买 nike

我知道给定 this 的值无法在编译时确定。我想知道一旦给定的对象被分配和构造,this 的值是什么?缓存,还是每次使用都对表达式进行运行时评估?这是激发我的问题的具体例子。请注意,这违反了 C++ 旨在坚持的所有 OOP 原则和保护功能。

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读取存储值,移植后&objectthis不会一样的。这显然不是我的编译器的实现方式,但我想知道这是出于一致性还是运气。

最佳答案

this 的值永远不会被对象“查询”。它作为隐式参数传递给(非静态)对象方法。

假设您有此 C++ 代码:

#include <stdio.h>

class mystring
{
public:
char *data;
void print();
};

void mystring::print()
{
fputs(this->data, stdout);
}

void
main()
{
mystring s = {"Hello World"};

s.print();
}

现在看起来 print 方法不带任何参数,但实际上它带了一个指向对象 s 的指针。因此编译器将生成与此 c 程序等效的代码。

#include <stdio.h>

struct mystring
{
char *data;
};

void mystring_print(struct mystring *this)
{
fputs(this->data, stdout);
}

void
main()
{
mystring s = {"Hello World"};

mystring_print(&s);
}

所以 this 指针没有什么神奇之处。与其他任何参数一样,它只是一个无聊的参数。虚拟方法让事情变得更有趣,但是 this 的处理保持不变

关于c++ - C++ 中 "this"关键字的实现限制,因为它涉及危险但功能示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52433962/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com