供自己或有需要的朋友查询参考。
博客为读《剑指offer》的笔记,内容有些摘录自书籍原文。如有错误请帮忙指明,谢谢。
一个空的类型,里面没有任何成员变量和成员函数,该类型sizeof结果为1;
原因:实例求sizeof本应该是0,但我们声明该实例时,它必须在内存中占有一定的空间。至于占用多少内存,有编译器决定。Visual Studio中占用1个字节空间。
如果添加一个构造函数和析构函数,再求sizeof结果依然是1;
原因:调用构造函数和析构函数只需要知道函数的地址即可,而地址只与类型相关,与类型的实例无关。编译器不会因为这两个函数而在实例内添加任何额外的信息。
如果把析构函数标记为虚函数:
虚函数会生成虚函数表,并且在该类型的每一个实例中会添加一个指向虚函数表的指针。而指针在32位机器上占4字节,在64位机器上占8字节。
传值参数:把形参复制到实参时会调用复制构造函数。而将传值参数改为常量引用即可减少不必要的消耗。
struct与class的区别:
如果没有标明成员函数或成员变量的访问权限级别。在C++中struct默认是public,class默认是private.在C#中struct与class默认都是private。struct和class的区别在于:struct定义的是值类型,值类型的实例在栈上分配内存。而class定义的是引用类型,引用类型的实例在堆上分配内存。
C#中构造函数的先后执行顺序:
原文代码
class A
{
public A(string text)
{
Console.WriteLine(text);
}
}
class B
{
static A al = new A("a1");
A a2 = new A("a2");
static B()
{
a1 = new A("a3");
}
public B()
{
a2 = new A("a4");
}
}
class Program
{
static void Main(string[] args)
{
B b = new B();
}
}
代码输出a1、a3、a2、a4
个人理解:函数的静态构造函数优先于普通构造函数。这段代码中,会先执行静态构造函数。然而静态构造函数中使用了变量a1,所以在执行静态构造函数内的语句前,会先初始化a1.静态构造函数执行完毕后执行普通构造函数,同理需先初始化a2;
实现Singleton(单例)模式
书籍内提到了5中方式。由于我C#水平挺差的,便改成C++实现(当然我C++水平也不高),如果有错误请帮忙指明,万分感谢。
1.只适用于单线程环境:
public class Singleton{
private:
Singleton(){
}
static Singleton instance = null;
public:
static Singleton Instance{
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
最简单的方式,基本稍微了解点单例模式的都知道这个。但只适用于单线程环境,如果多个线程运行就可能创建了多个实例。
2.能在多线程工作但效率不高
std::mutex mtx
public class Singleton{
private:
Singleton(){
}
static Singleton instance = null;
public:
static Singleton Instance{
mtx.lock();
if(instance == null){
instance = new Singleton;
}
mtx.unlock();
return instance;
}
}
缺点:频繁加同步锁,效率不高
3.较优解法
std::mutex mtx;
public class Singleton{
private:
Singleton(){
}
static Singleton instance = null;
public:
static Singleton Instance{
if(instance == null){
mtx.lock();
if(instance == null){
instance = new Singleton;
}
mtx.unlock();
}
return instance;
}
}
4.优解1(利用C#中的静态构造函数)
原文代码:
public sealed class Singleton4
{
private Singleton4()
{
}
private static Singleton4 instance = new Singleton4();
public static Singleton4 Instance
{
get
{
return instance;
}
}
}
5.优解2(利用静态内部类)
public class Singleton{
private Singleton(){
}
public static Singleton Instance{
return Nested.instance;
}
private static class Nested{
private static Singleton instance = new Singleton)();
}
}