调用C#类的成员函数的时候,编译器有没有插入this指针作为参数(如同C++一样)?如果没有,它是怎样实现的。我想搞到关于C#类实例内存布局的资料,请问
哪里有(不是关于C#应用的)?
7 个解决方案
#1
强烈关注!
#2
应该有类似c++中的this指针,否则这样的构造函数就有可能出错
private string str;
public ctor(string str)
{
str=str //错误
this.str=str;
}
就是说有默认的this
private string str;
public ctor(string str)
{
str=str //错误
this.str=str;
}
就是说有默认的this
#3
>>调用C#类的成员函数的时候,编译器有没有插入this指针作为参数(如同C++一样)?
应该是一样的。
>>我想搞到关于C#类实例内存布局的资料,请问
这个和C++差不多,静态的变量,函数都是和类一起分布,内存只有一个映像。表示状态的变量和对象一起分布,有多个。
具体说说,我们讨论讨论。
应该是一样的。
>>我想搞到关于C#类实例内存布局的资料,请问
这个和C++差不多,静态的变量,函数都是和类一起分布,内存只有一个映像。表示状态的变量和对象一起分布,有多个。
具体说说,我们讨论讨论。
#4
最初我也认为C#和C++一样,compiler会在非静态成员函数中插入this指针,
后来看到委托delegate,觉得可能和C++有些不同:
ex:
delegate void MyDelegate();
class CFoo1
{
public void foo();
}
class CFoo2
{
public void foo();
}
class MainClass
{
static void Main()
{
MyDelegate myD;
CFoo1 foo1 = new CFoo1();
CFoo2 foo2 = new CFoo2();
myD += new MyDelegate(foo1.foo);
myD += new MyDelegate(foo2.foo);
myD();
}
}
这里可能有两种情况:
1,delegate 只是一个简单的函数指针数组,为保证CFoo1::foo和CFoo2::foo的原型相同,
没有将this指针作为隐含参数,由于C#代码时委托执行的中间代码,运行时平台可能用其它的
技术实现成员函数的调用;
2,delegate是一个带类型参数(模板)的函数指针数组,this指针作为成员函数的隐含参数。
这些都只能是猜测,关于C#和.Net Framework比较低层的资料太少了,感觉不能把握他,
还是C++比较好:即优美又公开。
后来看到委托delegate,觉得可能和C++有些不同:
ex:
delegate void MyDelegate();
class CFoo1
{
public void foo();
}
class CFoo2
{
public void foo();
}
class MainClass
{
static void Main()
{
MyDelegate myD;
CFoo1 foo1 = new CFoo1();
CFoo2 foo2 = new CFoo2();
myD += new MyDelegate(foo1.foo);
myD += new MyDelegate(foo2.foo);
myD();
}
}
这里可能有两种情况:
1,delegate 只是一个简单的函数指针数组,为保证CFoo1::foo和CFoo2::foo的原型相同,
没有将this指针作为隐含参数,由于C#代码时委托执行的中间代码,运行时平台可能用其它的
技术实现成员函数的调用;
2,delegate是一个带类型参数(模板)的函数指针数组,this指针作为成员函数的隐含参数。
这些都只能是猜测,关于C#和.Net Framework比较低层的资料太少了,感觉不能把握他,
还是C++比较好:即优美又公开。
#5
看看jeffery richter写的那个.net书的也有会又帮助。
#6
>>调用C#类的成员函数的时候,编译器有没有插入this指针作为参数(如同C++一样)?
没有插入,原因很简单.C++是基于源代码级别的OOPL,也就是说编译后的依然是二进制代码
而C#是在CRL阶段就支持OOPL的.C#编译后的IL你可以你可以看的到,它是被编译成Assembly
每个Assembly是自描述,所以不需要.
>>如果没有,它是怎样实现的。
matedata 元数据,实现的,因为可以自描述
>>我想搞到关于C#类实例内存布局的资料,请问
哪里有(不是关于C#应用的)?
内存布局不用考虑,因为GC是自动回收的.所以内存指针不断变化
因为其是托管环境下的内存使用和普通的物理内存布局不大相同
要实现物理布局,必须使用相关特性.如:[structlayout]
另:如果你想开发底层环境不要用C#,C#是用来开发企业环境的分布式企业
资源的分布和整合的.C是用来开发事实环境的应用的.C++更多是来开发
图形和图象算法的实现的(开源社区里多为如此).因此太底层的特性不用
太多考虑.在这如果考虑使用C#建议多学习有关OOA和OOD方面的知识,否则
OOPL!=OOP
没有插入,原因很简单.C++是基于源代码级别的OOPL,也就是说编译后的依然是二进制代码
而C#是在CRL阶段就支持OOPL的.C#编译后的IL你可以你可以看的到,它是被编译成Assembly
每个Assembly是自描述,所以不需要.
>>如果没有,它是怎样实现的。
matedata 元数据,实现的,因为可以自描述
>>我想搞到关于C#类实例内存布局的资料,请问
哪里有(不是关于C#应用的)?
内存布局不用考虑,因为GC是自动回收的.所以内存指针不断变化
因为其是托管环境下的内存使用和普通的物理内存布局不大相同
要实现物理布局,必须使用相关特性.如:[structlayout]
另:如果你想开发底层环境不要用C#,C#是用来开发企业环境的分布式企业
资源的分布和整合的.C是用来开发事实环境的应用的.C++更多是来开发
图形和图象算法的实现的(开源社区里多为如此).因此太底层的特性不用
太多考虑.在这如果考虑使用C#建议多学习有关OOA和OOD方面的知识,否则
OOPL!=OOP
#7
yarshray(saga jion(心飘情落))
受益匪浅:)
受益匪浅:)
#1
强烈关注!
#2
应该有类似c++中的this指针,否则这样的构造函数就有可能出错
private string str;
public ctor(string str)
{
str=str //错误
this.str=str;
}
就是说有默认的this
private string str;
public ctor(string str)
{
str=str //错误
this.str=str;
}
就是说有默认的this
#3
>>调用C#类的成员函数的时候,编译器有没有插入this指针作为参数(如同C++一样)?
应该是一样的。
>>我想搞到关于C#类实例内存布局的资料,请问
这个和C++差不多,静态的变量,函数都是和类一起分布,内存只有一个映像。表示状态的变量和对象一起分布,有多个。
具体说说,我们讨论讨论。
应该是一样的。
>>我想搞到关于C#类实例内存布局的资料,请问
这个和C++差不多,静态的变量,函数都是和类一起分布,内存只有一个映像。表示状态的变量和对象一起分布,有多个。
具体说说,我们讨论讨论。
#4
最初我也认为C#和C++一样,compiler会在非静态成员函数中插入this指针,
后来看到委托delegate,觉得可能和C++有些不同:
ex:
delegate void MyDelegate();
class CFoo1
{
public void foo();
}
class CFoo2
{
public void foo();
}
class MainClass
{
static void Main()
{
MyDelegate myD;
CFoo1 foo1 = new CFoo1();
CFoo2 foo2 = new CFoo2();
myD += new MyDelegate(foo1.foo);
myD += new MyDelegate(foo2.foo);
myD();
}
}
这里可能有两种情况:
1,delegate 只是一个简单的函数指针数组,为保证CFoo1::foo和CFoo2::foo的原型相同,
没有将this指针作为隐含参数,由于C#代码时委托执行的中间代码,运行时平台可能用其它的
技术实现成员函数的调用;
2,delegate是一个带类型参数(模板)的函数指针数组,this指针作为成员函数的隐含参数。
这些都只能是猜测,关于C#和.Net Framework比较低层的资料太少了,感觉不能把握他,
还是C++比较好:即优美又公开。
后来看到委托delegate,觉得可能和C++有些不同:
ex:
delegate void MyDelegate();
class CFoo1
{
public void foo();
}
class CFoo2
{
public void foo();
}
class MainClass
{
static void Main()
{
MyDelegate myD;
CFoo1 foo1 = new CFoo1();
CFoo2 foo2 = new CFoo2();
myD += new MyDelegate(foo1.foo);
myD += new MyDelegate(foo2.foo);
myD();
}
}
这里可能有两种情况:
1,delegate 只是一个简单的函数指针数组,为保证CFoo1::foo和CFoo2::foo的原型相同,
没有将this指针作为隐含参数,由于C#代码时委托执行的中间代码,运行时平台可能用其它的
技术实现成员函数的调用;
2,delegate是一个带类型参数(模板)的函数指针数组,this指针作为成员函数的隐含参数。
这些都只能是猜测,关于C#和.Net Framework比较低层的资料太少了,感觉不能把握他,
还是C++比较好:即优美又公开。
#5
看看jeffery richter写的那个.net书的也有会又帮助。
#6
>>调用C#类的成员函数的时候,编译器有没有插入this指针作为参数(如同C++一样)?
没有插入,原因很简单.C++是基于源代码级别的OOPL,也就是说编译后的依然是二进制代码
而C#是在CRL阶段就支持OOPL的.C#编译后的IL你可以你可以看的到,它是被编译成Assembly
每个Assembly是自描述,所以不需要.
>>如果没有,它是怎样实现的。
matedata 元数据,实现的,因为可以自描述
>>我想搞到关于C#类实例内存布局的资料,请问
哪里有(不是关于C#应用的)?
内存布局不用考虑,因为GC是自动回收的.所以内存指针不断变化
因为其是托管环境下的内存使用和普通的物理内存布局不大相同
要实现物理布局,必须使用相关特性.如:[structlayout]
另:如果你想开发底层环境不要用C#,C#是用来开发企业环境的分布式企业
资源的分布和整合的.C是用来开发事实环境的应用的.C++更多是来开发
图形和图象算法的实现的(开源社区里多为如此).因此太底层的特性不用
太多考虑.在这如果考虑使用C#建议多学习有关OOA和OOD方面的知识,否则
OOPL!=OOP
没有插入,原因很简单.C++是基于源代码级别的OOPL,也就是说编译后的依然是二进制代码
而C#是在CRL阶段就支持OOPL的.C#编译后的IL你可以你可以看的到,它是被编译成Assembly
每个Assembly是自描述,所以不需要.
>>如果没有,它是怎样实现的。
matedata 元数据,实现的,因为可以自描述
>>我想搞到关于C#类实例内存布局的资料,请问
哪里有(不是关于C#应用的)?
内存布局不用考虑,因为GC是自动回收的.所以内存指针不断变化
因为其是托管环境下的内存使用和普通的物理内存布局不大相同
要实现物理布局,必须使用相关特性.如:[structlayout]
另:如果你想开发底层环境不要用C#,C#是用来开发企业环境的分布式企业
资源的分布和整合的.C是用来开发事实环境的应用的.C++更多是来开发
图形和图象算法的实现的(开源社区里多为如此).因此太底层的特性不用
太多考虑.在这如果考虑使用C#建议多学习有关OOA和OOD方面的知识,否则
OOPL!=OOP
#7
yarshray(saga jion(心飘情落))
受益匪浅:)
受益匪浅:)