C++??????????????
???????????? ???????[ 2016/4/22 10:47:28 ] ??????????????????? .NET
?????????????????У?C++????????????????????????У????????????????????????????????£???????????????????C???????????????Э???????????????????
??????????????????????????????(mian)??(shi)?????????ó?????????????μ?????
???????????G++????????????????????????C++??????????????????????????????????а??? ???á???(???????????????)?????(????????????)?????????
????Here we go!
????????
??????????????????????????C++ primer???????????????????????????????????????
????????
int invoke(int a) {
return ++a;
}
int main(int argc?? char **argv) {
int a = 123; // movl $123??-20(%rbp)
int *pa = &a; // leaq -20(%rbp)??%rax
// movq %rax??-16(%rbp)
int &ra = a; // leaq -20(%rbp)??%rax
// movq %rax??-8(%rbp)
invoke(a); // movl -20(%rbp)??%eax
// movl %eax??%edi
// call _Z6invokei
invoke(*pa); // movq -16(%rbp)??%rax
// movl (%rax)??%eax
// movl %eax??%edi
// call _Z6invokei
invoke(ra); // movq -8(%rbp)??%rax
// movl (%rax)??%eax
// movl %eax??%edi
// call _Z6invokei
}
???????????pa????????a???????ra?????a??????????????????????pa??ra??????????????????????????????????????????????????????????????????a????????????????????????????????????
???????????????????????????????????????????????????????????????????????????в????????
???????????????????ü?????д??????????//TODO
??????(???????????????)
???????????????б???????±????????????????????????????涼????????????????????????????????????????????????????????????????????????????????????????
?????????????????????У???Щ????????????????е?????????????????????????????????????????????ν?????????????????????????ж???
?????????????????????????????????б???ú???????????????
int invoke(int a) { // _Z6invokei
return ++a;
}
class Animal {
public:
int age;
int weight;
Animal(): age(0)?? weight(0.0) {} // _ZN6AnimalC2Ev
void run() { } // _ZN6Animal3runEv
};
class Human {
public:
Human() {} // _ZN5HumanC2Ev
};
int main(int argc?? char **argv) {
Animal cat; // leaq -16(%rbp)?? %rax
// movq %rax?? %rdi
// call _ZN6AnimalC1Ev
cat.age = 5; // movl $5?? -16(%rbp)
cat.weight = 2; // movl $2?? -12(%rbp)
cat.run(); // leaq -16(%rbp)?? %rax
// movq %rax?? %rdi
// call _ZN6Animal3runEv
}
??????????????????????????????????Animal??????Human??
?????????main???????
????????????
???????????Animal cat;??????????Animal?????cat?????????????????????cat???????????????????????????????16??????????-16(%rbp)?????cat????????rdi??????????????C++???????????????????????????this??????????????????_ZN6AnimalC1Ev??????????У???Animal????????????????????????????Animal??????????
???????????
?????????????????C????????????????
???????????????
????????????run()???????????????????????????????????????
???????G++????????ж??????????????????
????Animal ??
????????????? invoke() _Z6invokei
????????????????run() _ZN6Animal3runEv
???????????? Animal() _ZN6AnimalC2Ev
????Human ??
???????????? Human() _ZN5HumanC2Ev
???????????????C++?漲????????????????÷?????????????????????ò?????????????????ó???????????????this????????????ó?????????±???????????????????к?????????????????????????????????С?
?????????????????????C++??????????
???????????????????ν?????????????????????ν??????????????????????????????????????????????ν??????????????????????????????????????????????????Щ????????????????????????
???????(????????????)
????????
??????????????????????????????????????????????????:
????class Animal {
????public:
????void run() {} // _ZN6Animal3runEv
????void run(int a) {} // _ZN6Animal3runEi
????void run(char b) {} // _ZN6Animal3runEc
????void run(int a?? Human p) {} // _ZN6Animal3runEi5Human
????};
????G++???????????????????????β??б?????????е????????????ν???????????
???????
???????????????????????????????????????????????????????г?????????丸?????????????С???????????????????????????е??????????????
???????????????????????????????????????????
????????????
class Animal {
public:
virtual void run() {} // _ZN6Animal3runEv
};
class Cat : public Animal {
public:
void run() {} // _ZN3Cat3runEv
};
int main(int argc?? char **argv) {
Animal *tom = new Cat(); // _ZN3CatC2Ev:
// _ZN6AnimalC2Ev:
// movq $_ZTV6Animal+16?? (%rax)
// movq $_ZTV3Cat+16?? (%rax)
tom.run(); // movq %rbx?? -24(%rbp)
// movq -24(%rbp)?? %rax
// movq (%rax)?? %rax
// movq (%rax)?? %rax
// movq -24(%rbp)?? %rdx
// movq %rdx?? %rdi
// call *%rax
}
?????????????new Cat()??????2????????????????????????????????????????????????????????(%rax)???tom????????е????λ??????????Ч??????????movq $_ZTV3Cat+16?? (%rax)??Cat???_?麯????_????????cat????????λ?á?
???????tom.run()????????????????????call *%rax?????????Cat????麯???????????????
??????????ν????????????????????????????ν??????????????????????????????????Щ?????????????????tom??????Cat?????????????tom????????run???е????????tom.run()???????????call _ZN3Cat3runEv??
???????????????????????????????????????????????????:
????int main(int argc?? char **argv) {
????Animal *tom;
????if (argc == 0)
????tom = new Animal();
????else
????tom = new Cat();
????tom->run();
????}
?????????????tom->run()?????????????????????run????????????????δ?????????????????????????????????????????????????????tom?????????????????????麯?????????????????????????????????
???????????
class Cat {};
class Mouse {};
template <typename T>
class Cave {
public:
void capture(T& a) {};
};
int main(int argc?? char **argv) {
Cat tom;
Mouse jerry;
Cave<Cat> catsCave;
catsCave.capture(tom); // call _ZN4CaveI3CatE7captureERS0_
Cave<Mouse> miceCave;
miceCave.capture(jerry); // call _ZN4CaveI5MouseE7captureERS0_
}
????????????????????????????????????????????????????
????????????????????????м?????????????????????????????????????????????????????????????
??????????????????????????????è?????????????????????????????????
????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????C++????????
?????????д????????C++???????Щ????????????????????????·???Щ??????
?????????C++?????????????????仰??C++???????????????????????
??????
???·???
??????????????????
2023/3/23 14:23:39???д?ò??????????
2023/3/22 16:17:39????????????????????Щ??
2022/6/14 16:14:27??????????????????????????
2021/10/18 15:37:44???????????????
2021/9/17 15:19:29???·???????·
2021/9/14 15:42:25?????????????
2021/5/28 17:25:47??????APP??????????
2021/5/8 17:01:11