我在FreeRTOS(FreeRTOSV7.4.0\FreeRTOS\Source\tasks.c)中找到了一些代码:
void vTaskSuspendAll( void )
{
/* A critical section is not required as the variable is of type
portBASE_TYPE. */
++uxSchedulerSuspended;
}
Run Code Online (Sandbox Code Playgroud)
它明确表示不需要保护,因为类型是"portBASE_TYPE",这是一个"长"类型.我的理解是它假设这种类型的自增量是原子的.但是在我拆开它后我找不到任何证据,它是一个普通的load-> add-> store.那是一个问题吗?
void vTaskSuspendAll( void )
{
/* A critical section is not required as the variable is of type
portBASE_TYPE. */
++uxSchedulerSuspended;
4dc: 4b03 ldr r3, [pc, #12] ; (4ec <vTaskSuspendAll+0x10>)
4de: f8d3 2118 ldr.w r2, [r3, #280] ; 0x118
4e2: 1c50 adds r0, r2, #1
4e4: f8c3 0118 str.w r0, [r3, #280] ; 0x118 …Run Code Online (Sandbox Code Playgroud) 可能重复:
为什么允许通过基类的指针调用派生类的私有虚方法?
最近,我遇到了一个奇怪的问题,请参考以下代码:
#include <iostream>
using namespace std;
class A
{
public:
virtual void disp() {
cout<<"A disp"<<endl;
}
};
class B : public A
{
private:
void disp() {
cout<<"B disp"<<endl;
}
};
int main()
{
A a;
a.disp();
A *b = new B();
b->disp();
}
Run Code Online (Sandbox Code Playgroud)
输出是:
A disp
B disp
Run Code Online (Sandbox Code Playgroud)
我想知道为什么指针b可以访问disp()?这是私人的!不是吗?