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