C++ C++;Isn';这不是一个无用的内联声明吗?

C++ C++;Isn';这不是一个无用的内联声明吗?,c++,inline,private,member,protected,C++,Inline,Private,Member,Protected,这是关于内联函数的另一个问题。 但我将立即接受可能的评论和回答: 在类中定义函数使其自动内联 通过将函数标记为inline,可以实现相同的行为 课外活动 内联函数不必内联。它是 完全取决于编译器来内联它 现在,我的问题是: 内联函数意味着将主体复制到调用它的位置 假设编译器在访问私有或受保护的成员时不会内联它,这难道不是正确的吗 程序将无法访问成员权限? 我想知道这一点,因为在我看来,如果有人内联一个显然无法内联的函数,那一定会很奇怪。 以下是一个例子: //声明 类控制器 { 公众: bo

这是关于内联函数的另一个问题。
但我将立即接受可能的评论和回答:

  • 在类中定义函数使其自动内联
  • 通过将函数标记为inline,可以实现相同的行为 课外活动
  • 内联函数不必内联。它是 完全取决于编译器来内联它
  • 现在,我的问题是:
    内联函数意味着将主体复制到调用它的位置
    假设编译器在访问私有或受保护的成员时不会内联它,这难道不是正确的吗
    程序将无法访问成员权限?

    我想知道这一点,因为在我看来,如果有人内联一个显然无法内联的函数,那一定会很奇怪。

    以下是一个例子:

    //声明
    类控制器
    {
    公众:
    bool bHasTarget();
    私人:
    常量对象*pTarget;
    };
    //定义
    内联布尔控制器::bHasTarget(){
    返回!(pTarget==nullptr)//
    内联函数不能由编译器内联。完全由编译器内联

    编译器可以内联,但也可以不内联。它不能保证内联

    假设编译器在访问私有或受保护的成员时不会内联它,这难道不是正确的吗

    不,这样假设是不对的。访问私有或受保护的成员不会阻止内联

    程序将无法访问成员,对吗

    该程序实际上能够访问私有和受保护的成员。该函数是一个成员,无论它是否是内联的

    更详细地说,在进行任何内联优化之前,编译器会检查程序是否违反访问规则。检查通过后,访问说明符对生成的程序没有意义,并且不会限制任何优化


    示例函数可以内联。

    编译器可以访问所有内容。这些限制仅对程序员有效。这意味着编译器访问任何变量都没有限制!最后每个变量都被转换为可以访问的地址。因此,对于编译器来说,这没有问题以内联您提供的代码

    作为程序员,访问私有变量也有一些“欺骗”

    struct foo
    {
    private:
        int a;
        int b;
    };
    
    ...
    foo test;
    int *cheat = reinterpret_cast<int*>(&test);
    cheat[0] = 1;    //This would Change a
    ...
    
    structfoo
    {
    私人:
    INTA;
    int b;
    };
    ...
    foo试验;
    int*cheat=重新解释和测试;
    作弊[0]=1;//这将更改
    ...
    
    首先,您有一个输入错误,应该是
    ==
    。编译器可以访问任何内容,所以它可以内联它想要的任何内容(只要它看到它,这里pTarget对编译器是可见的)关于第一点,我认为你的意思是定义函数,而不仅仅是声明它。我不是英语母语人士,但我很确定“内联函数可能没有内联”最好读为“内联函数可能没有内联”@tobi:
    inline
    函数可能没有内联”:你是对的,这是不明确的。但是你的版本没有解决问题。我会说“内联函数不必内联。”啊,我理解你的欺骗。(你确定你更改了a而不是b吗?)但是对于这一点,我想你需要知道foo是如何构造的。好吧,谢谢。我还不知道编译器是如何工作的,但很高兴知道:)是的,这会改变a。
    check[1]
    会改变b
    struct foo
    {
    private:
        int a;
        int b;
    };
    
    ...
    foo test;
    int *cheat = reinterpret_cast<int*>(&test);
    cheat[0] = 1;    //This would Change a
    ...