c++ - 限制成员函数的限定符(限制此指针)

标签 c++ gcc this-pointer restrict-qualifier

注意:澄清一下,问题不是一般意义上的 restrict 关键字的使用,而是具体关于将其应用于成员函数的问题,如 here 所述。 .

gcc 允许您在成员函数上使用 __restrict__(GNU++ 相当于 C99 的 restrict)限定符,有效地使 this 成为 restrict函数范围内的限定指针。牛肉在哪里?

大多数成员函数作用于其他成员,通过 this 访问它们,它是一个 T* const(通常没有别名)。要使 this 可能具有别名,则需要在成员函数中以某种方式使用第二个指向类型的指针,并且它必须来自某个地方。
这是非成员函数经常出现的情况,例如所有二元运算符或任何其他至少采用相同的、非平凡类型的指针或引用的任何其他自由函数。但是,这些函数没有 this,因此它们不相关。

赋值运算符、复制构造函数和一元比较运算符是成员函数的示例,其中 this 原则上可以 别名(因为另一个对象是通过引用传递的)。因此,为这些函数分配一个 restrict 限定符才真正有意义——对于编译器来说,所有其他函数无论如何都具有 restrict 属性应该已经很明显了(因为从来没有第二个指向 T 的指针)。

现在,例如,如果您在 operator= 上使用了 restrict,您应该因此根本不检查自赋值,因为您再说 this 在该函数的范围内没有别名(如果这是真的,则不可能发生自赋值)。
显然,这是你不可能事先知道的事情,也是没有意义的事情。

那么,在什么情况下人们真的想给成员函数一个 restrict 限定符并且它在什么情况下有意义?

最佳答案

要么是我遗漏了什么,要么是你的问题没有意义。 this 与成员函数的任何其他参数没有that 不同,那么为什么您对 GCC 允许您对其应用 restrict 感到惊讶?

关于将其应用于赋值运算符,您正确地指出它将避免显式自赋值测试的需要。然后你说:

Obviously, this is something that you cannot possibly know in advance

但是当您对任何内容使用 restrict 时,这总是是真的。例如,有人可能决定调用具有重叠内存区域的 memcpy;你“不可能事先知道”他们不会这样做。但是 memcpy 的参数的 restrict 声明意味着 如果他们这样做,他们就犯了错误。以完全相同的方式,如果您声明一个赋值运算符 restrict,那么您就已经使某人对该类的对象进行 self 赋值成为错误。这根本没有什么神秘或矛盾的地方;它只是 restrict 语义的一部分,它对您的代码的其余部分施加了某些约束。

我也不确定为什么您会发现成员函数不可能将指针(或引用)指向另一个相同类型的对象。简单的例子:

class Point {
public:
    double distance(const Point &other) const;
};

这种事时有发生。

所以真正的问题是,为什么您认为 this 与任何其他论点如此不同?或者,如果您愿意,我怎么会完全忽略您的观点?

关于c++ - 限制成员函数的限定符(限制此指针),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6808472/

相关文章:

c++ - 在 C++ 中返回 "This"对象的函数

c++ - LNK 2001 未解析的外部 NPPluginFuncs struct ptr 作为静态类成员

c - 为库函数定义编译器警告/错误

c - 将全局常量数组放入 `.rodata` 部分

c++ - 自包含从 std::enable_shared_from_this 继承的自身的 shared_ptr

c++ - 你能解释一下this指针的概念吗?

c++ - 用于 C++ 开发的 OSX 环境变量

c++ - 为什么 std::unique_ptr 没有明确要求 noexcept Deleter?

c++ - 类之间的转换构造函数c++

amazon-web-services - Lambda 是否允许 libstdc++.so.6? AWS lambda 是否有 GCC-8.0.1?