我试图在我的代码中使用扩展名(例如Employee.cs或Employee.aspx.cs)获取类名.我能够获得没有扩展名的类的名称,但是有人知道我怎么能得到类的扩展?
这就是我为了获得类名而做的事情:
var frame = new StackFrame(1);
string className = frame.GetMethod().ReflectedType.Name;
Run Code Online (Sandbox Code Playgroud) 假设我们有以下代码:
int func(char str[], int len) {
// Don't return anything here.
}
int main() {
char str[] = "Hello";
int result = func(str, strlen(str));
printf("%d\n", result);
}
Run Code Online (Sandbox Code Playgroud)
它会在我的电脑上打印一些字符串值-1679929632.当我执行时,它会不时变化.
谁能解释为什么会这样?
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-0x4],edi
Run Code Online (Sandbox Code Playgroud)
在汇编函数序言中,不是push rbp已经将其值移到了rsp?为什么mov rbp, rsp指令再次移动相同的rsp值rbp?是必要的还是多余的?
在这个简单的函数中,为局部变量分配了空间。然后,变量被初始化并被printf调用以输出它们。
000000000040056a <func>:
40056a: 55 push rbp ; function prologue
40056b: 48 89 e5 mov rbp,rsp ; function prologue
40056e: 48 83 ec 10 sub rsp,0x10 ; deallocating space for local variables
400572: 8b 4d fc mov ecx,DWORD PTR [rbp-0x4] ; variable initialization
400575: 8b 55 f8 mov edx,DWORD PTR [rbp-0x8] ; variable initialization
400578: 8b 45 f4 mov eax,DWORD PTR [rbp-0xc] ; variable initialization
40057b: 89 c6 mov esi,eax ; string stuff
40057d: bf 34 06 40 …Run Code Online (Sandbox Code Playgroud) 让我们从一个简单的堆栈分配示例开始:
void f() {
int a, b;
...
}
Run Code Online (Sandbox Code Playgroud)
如果我理解正确的话。a那么和的地址b与栈基址(即寄存器 )有固定的偏移量ebp。如果我们以后需要它们,这就是编译器找到它们的方式。
但请考虑以下代码。
void f(int n) {
int a;
alloca(n);
int b;
...
}
Run Code Online (Sandbox Code Playgroud)
如果编译器不做任何优化,堆栈将为a->n->b. 现在 的偏移量b取决于n。那么编译器做了什么?
模仿alloca() 在内存级别如何工作?。我尝试了以下代码:
#include <stdio.h>
#include <alloca.h>
void foo(int n)
{
int a;
int *b = alloca(n * sizeof(int));
int c;
printf("&a=%p, b=%p, &c=%p\n", (void *)&a, (void *)b, (void *)&c);
}
int main()
{
foo(5);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是&a=0x7fffbab59d68, b=0x7fffbab59d30, …