int offset = (int)(t*)1 - (int)(singleton *)(t*)1

看到一段ogre的原码看到在sigleton.h中的  
  int   offset   =   (int)(t*)1   -   (int)(singleton   <t>*)(t*)1;这段看不明白请各位高手指点8,9。  
   
  下面是原码:  
   
  namespace   ogre   {  
          template   <typename   t>   class   singleton  
          {  
          protected:  
                  static   t*   ms_singleton;  
          public:  
                  singleton(   void   )  
                  {  
                          assert(   !ms_singleton   );  
                          int   offset   =   (int)(t*)1   -   (int)(singleton   <t>*)(t*)1;  
                          ms_singleton   =   (t*)((int)this   +   offset);  
                  }  
                  ~singleton(   void   )  
                          {     assert(   ms_singleton   );     ms_singleton   =   0;     }  
                  static   t&   getsingleton(   void   )  
  { assert(   ms_singleton   );     return   (   *ms_singleton   );   }  
                  static   t*   getsingletonptr(   void   )  
  {   return   ms_singleton;   }  
          };  
  }  
   
  谢谢请各位详细说明一下。

发表者:ddmor

在静态变量   ms_singleton保存当前singleton<t>类对象的首地址。比如  
  singleton<double>   d;  
  则&d==singleton<double>::ms_singleton  
  int   offset   =   (int)(t*)1   -   (int)(singleton   <t>*)(t*)1;这句话其实是防止编译器在将t*转换为(singleton   <t>*)指针的时候产生偏移,所以在将ms_singleton转换为(singleton   <t>*)的时候也能正常使用。  
  指针在做类型转换的时候可能会发生偏移,比如以下代码:  
  class   cbase{  
  public:  
  int   m_i;  
  };  
  class   ca:public   cbase  
  {  
  public:  
  virtual   ~ca(){};  
  };  
  int   main()  
  {  
  ca   a;  
  ca*p=&a;  
  cbase   *pbase=p;//pbase的值发生了偏移  
  return   0;  
  }

发表者:pongba

这代码写的...;(  
  估计它的用法是  
  singleton<s>*   ss   =   reinterpret_cast<singleton<s>*>(new   s);  
  new(ss)   singleton<s>;  
   
  如果用法真是这样这玩意也实在是太畸形了。  
   
  那段怪异的代码的作用肯定是防止意外偏移,不过第一,这种特定情况下不见得会有偏移,第二,它的做法也决不是符合标准的。

发表者:weirdy

class   ca   :public   singleton<ca>  
      {  
              int   a;  
      };  
      ca   *   singleton<ca>::ms_singleton;  
  int   main(int   argc,   char*   argv[])  
  {  
          char   *preceipt   =   "ff";  
          ca   obj;  
          cout   <<   sizeof(obj)   <<   endl;    
  return   0;  
  }  
  因为基类为空,当空基类优化时基类将不在ca中占空间.不管是否优化singleton<ca>::ms_singleton都将指向ca的唯一对象;  
  int   offset   =   (int)(t*)1   -   (int)(singleton   <t>*)(t*)1;就是用来计算偏移的,如果ca有虚函数,你看看这个offset还是不是0?变成-4了.

 
<think>好的,我现在需要帮用户处理关于“.NET面试题”的查询。首先,我得确定用户的具体需求是什么。他们可能是在准备.NET的面试,想要了解常见的面试题类型和内容,或者希望获得一些准备建议。接下来,我需要整理常见的.NET面试题,涵盖基础概念、框架特性、语言细节、实践问题等方面。 首先,基础部分可能包括CLR、CTS、CLS这些核心组件的解释,以及托管代码和非托管代码的区别。然后是关于.NET框架的问题,比如ASP.NET Core的特性、中间件的作用、依赖注入等。C#语言方面,可能会涉及装箱拆箱、async/await、LINQ、GC等知识点。 另外,用户可能对数据库相关的问题感兴趣,比如Entity Framework Core的使用、Code First迁移等。实践题方面,需要准备一些编码例子,比如单例模式、斐波那契数列的实现,或者算法题如反转字符串。设计模式问题也是常见的,比如工厂模式、观察者模式等。 还要考虑用户可能需要的进阶内容,如微服务架构、Docker部署、性能优化技巧等。需要确保回答结构清晰,分点列出,帮助用户逐步理解和准备。同时,要检查LaTeX格式是否正确,所有数学表达式和代码示例都符合系统级指令的要求。最后,提醒用户结合实际项目经验进行准备,并建议他们参考官方文档和社区资源,保持答案的实用性和可靠性。</think>以下是一份典型的 .NET 面试题知识框架及核心考点整理,帮助您系统化准备: --- ### 一、基础概念 1. **CLR、CTS、CLS 的区别** - `CLR`(公共语言运行时):负责代码执行、内存管理、线程管理等 - `CTS`(通用类型系统):定义跨语言的类型规范,如$int$对应$System.Int32$ - `CLS`(公共语言规范):确保多语言互操作的语法规则 2. **托管代码 vs 非托管代码** - 托管代码由CLR管理,非托管代码(如C++ DLL)直接通过OS执行 --- ### 二、.NET 框架 1. **ASP.NET Core 特性** - 跨平台、内置依赖注入、中间件管道(如`app.UseRouting()`) - 示例中间件顺序:异常处理 → 静态文件 → 路由 → 授权 → 终结点 2. **依赖注入生命周期** - `Transient`(每次请求新实例) - `Scoped`(同一请求内共享) - `Singleton`(全局单例) --- ### 三、C# 语言 1. **装箱与拆箱** ```csharp int i = 123; object o = i; // 装箱 int j = (int)o; // 拆箱 ``` - 性能损耗点:值类型与引用类型转换 2. **async/await 原理** - 编译器生成状态机,避免阻塞线程 - 错误处理:`try/catch`可捕获异步方法异常 3. **LINQ 查询执行方式** - 立即执行:`ToList()`, `Count()` - 延迟执行:`Where()`, `Select()` --- ### 四、数据库相关 1. **Entity Framework Core** - Code First 迁移命令:`dotnet ef migrations add <name>` - 延迟加载 vs 预先加载(`Include()`) 2. **SQL 优化** - 索引设计原则 - 避免`SELECT *`,使用分页(`OFFSET-FETCH`) --- ### 五、实践编码题 1. **单例模式实现** ```csharp public sealed class Singleton { private static readonly Lazy<Singleton> _instance = new Lazy<Singleton>(() => new Singleton()); public static Singleton Instance => _instance.Value; private Singleton() { } } ``` 2. **斐波那契数列(递归优化)** ```csharp public int Fibonacci(int n, Dictionary<int, int> memo = null) { memo ??= new Dictionary<int, int>(); if (n <= 1) return n; if (memo.ContainsKey(n)) return memo[n]; memo[n] = Fibonacci(n-1, memo) + Fibonacci(n-2, memo); return memo[n]; } ``` --- ### 六、设计模式问题 1. **工厂模式应用场景** - 对象创建逻辑复杂时(如数据库连接器) 2. **观察者模式实现** - 使用`event`关键字或`IObservable<T>`接口 --- ### 七、进阶考点 1. **微服务架构** - 服务发现、API网关设计模式 - Docker 容器化部署命令示例:`docker build -t myapp .` 2. **性能优化** - 内存泄漏检测(使用`dotnet-dump`) - 异步编程最佳实践 --- ### 准备建议 1. 结合项目经验准备`STAR`法则案例(情境-任务-行动-结果) 2. 理解.NET 6/7/8新特性(如最小API、Hot Reload) 3. 参考微软官方文档:[.NET Documentation](https://learn.microsoft.com/en-us/dotnet/) 需要更深入的某个方向解析,可以告诉我具体领域哦! 🚀
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值