当前位置: 首页 > 知识库问答 >
问题:

检查子对象的地址是否在包含对象的范围内合法吗

姜煌
2023-03-14

2个问题:

> < li>

以下代码是否符合定义的行为?

是否有任何可能的c实现可以断言?

代码(c 11 及更高版本):

#include <cassert>
#include <utility>
#include <ciso646>

template<class T> 
auto to_address(T* p) { return reinterpret_cast<unsigned char const*>(p); }

/// Test whether part is a sub-object of object
template<class Object, class Part>
bool is_within_object(Object& object, Part& part)
{
    auto first = to_address(std::addressof(object)),
                 last = first + sizeof(Object);

    auto p = to_address(std::addressof(part));

    return (first <= p) and (p < last);
}

struct X
{
    int a = 0;

    int& get_a() { return a; }
    int& get_b() { return b; }
private:

    int b = 0;
};

int main()
{
    X x;

    assert(is_within_object(x, x.get_a()));
    assert(is_within_object(x, x.get_b()));
}

请注意,ab 具有不同的访问说明符。

共有1个答案

阎志义
2023-03-14

指针比较在[expr.rel]/3-4中定义:

比较指向对象的不等指针定义如下:

    < li >如果两个指针指向同一数组的不同元素或其子对象,则指向下标较高的元素的指针比较大。 < li >如果两个指针递归地指向同一对象的不同非静态数据成员,或者指向这些成员的子对象,则指向后面声明的成员的指针比较大,前提是这两个成员具有相同的访问控制,并且它们的类不是联合。 < li >否则,两个指针都不会比另一个大。

如果两个操作数p和q比较相等,则p

我们可以从中得出什么结论?

一个对象中有相同类型的指针的总顺序,但是没有指向不同对象或具有不同权限改造的不同子对象的指针的顺序。这种缺乏一般的指针总顺序使得is_within_object()没有什么意义。在您期望它返回true的情况下,它是有效的。在您期望它返回false的情况下,这些运算符的结果是未指定的?这不是一个非常有用的结果。

也就是说,在[比较]的形式上,我们确实有一个巨大的漏洞:

对于模板lessmoreless_等于greater_等于,任何指针类型的特化都会产生严格的总顺序,该顺序在这些特化之间是一致的,并且也与内置运算符施加的部分顺序一致

因此,以下内容将被很好地定义:

template<class T> 
auto byte_address(T& p) {
    return reinterpret_cast<std::byte const*>(std::addressof(p));
}

template<class Object, class Part>
bool is_within_object(Object& object, Part& part)
{
    auto first = byte_address(object);
    auto last = first + sizeof(Object);   
    auto p = byte_address(part);


    return std::less_equal<std::byte*>{}(first, p) &&
        std::less<std::byte*>{}(p, last);
}

 类似资料:
  • 我有两个类,大致定义如下: 我知道只存在于中,并且当且仅当相应对象是成员,而不是时,相应的bool标志将设置为。 我正在寻找一种符合标准的方法来派生指向包含一些内部对象的对象的指针。当然,我可以只在每个对象中存储一个指针,但由于类非常小,而且我有很多,这似乎是浪费内存(因此也是宝贵的缓存)。 显然,编译器应该知道,和包含的对象之间的内存偏移量。问题是:是否有一种符合标准的方法告诉编译器“获取该偏移

  • 我试图使用一种方法来检查一个数组列表是否包含一个带有属性的对象。 这是我目前拥有的,但我无法让它发挥作用。

  • 问题内容: 有没有一种快速的方法来检查对象是jQuery对象还是本机JavaScript对象? 例: 显然,上面的代码有效,但并不安全。您可能会向对象添加选择器键并获得相同的结果。有没有更好的方法来确保该对象实际上是jQuery对象? 符合 问题答案: 您可以使用运算符: 说明 :该函数(又名)被实现为构造函数。构造函数将以前缀调用。 调用时,内部jQuery将此转换为1。JavaScript继续

  • 问题内容: 说我的课很简单 我希望将此类s 的集合存储在People类的属性中,该属性是类型为Person的数组 也许我做到这一点如下 问题:请问我如何检查people.list是否包含实例alex? 我很想尝试的简单尝试 称一个错误 问题答案: 有两个功能: 编译器在抱怨是因为编译器知道不是,因此需要一个谓词,但不是谓词。 如果阵列中的人员是(不是),则可以使用: 由于它们不相等,因此可以将第二

  • 请看do while循环,我认为注释是不言自明的。我想检查该集合是否设置了所有具有符号a、b、c、d的卡片(借助数组或其他任何东西实现它)。

  • 我试图通过JS对象(1)来找出另一个对象(2)上是否存在值,并返回对象(2)的find值。 在这种情况下,我只能通过得到真/假来找出它是否存在,我也试过这个 但是在这种情况下,它只返回空数组,而不是对象(1)值找到的对象(2)值