当前位置: 首页 > news >正文

二手房网站建设制作高端app开发公司

二手房网站建设,制作高端app开发公司,跨境电商的运营模式有哪些,织梦网站下载地址一#xff1a;背景 在玩 C 的时候#xff0c;经常会用 void* 来指向一段内存地址开端#xff0c;然后再将其强转成尺度更小的 char* 或 int* 来丈量一段内存#xff0c;参考如下代码#xff1a;int main() {void* ptr malloc(sizeof(int) * 10);int* int_ptr (int*)ptr;… 一背景 在玩 C 的时候经常会用 void* 来指向一段内存地址开端然后再将其强转成尺度更小的 char* 或 int* 来丈量一段内存参考如下代码int main() {void* ptr  malloc(sizeof(int) * 10);int* int_ptr  (int*)ptr;char* char_ptr  (char*)ptr; }由于 C 的自由度比较大想怎么玩就怎么玩带来的弊端就是容易隐藏着一些不易发现的bug归根到底还是程序员的功底不扎实C 设计者觉得不能把程序员想的太厉害应该要力所能及的帮助程序员避掉一些不必要的潜在 bug并且还要尽最大努力的避免对性能有过多的伤害所以就出现了 4 个强制类型转换运算符。const_castreinterpret_castdynamic_caststatic_cast既然 C 做了归类必然就有其各自用途接下来我们逐一和大家聊一下。二理解四大运算符 1. const_cast这是四个运算符中最好理解的玩过 C 的都知道默认情况下是不能修改一个 const 变量比如下面这样int main() {const int i  10;i  12; }这段代码肯定是要报错的那如果我一定要实现这个功能如何做呢这就需要用到 const_cast 去掉它的常量符号然后对 i 进行操作即可所以修改代码如下int main() {const int i  10;auto j  const_castint*(i);*(j)  12; }2. reinterpret_cast从名字上看就是一个 重新解释转换很显然这个非常底层如果大家玩过 windbg 应该知道用 dt 命令可以将指定的内存地址按照某一个结构体丈量出来比如说 C# 的 CLR 在触发 GC 时会有 gc_mechanisms 结构参考代码如下0:000 dt WKS::gc_mechanisms 0x7ffb6ba96e60 coreclr!WKS::gc_mechanisms0x000 gc_index         : 10x008 condemned_generation : 0n00x00c promotion        : 0n00x010 compaction       : 0n10x014 loh_compaction   : 0n00x018 heap_expansion   : 0n00x01c concurrent       : 00x020 demotion         : 0n00x024 card_bundles     : 0n10x028 gen0_reduction_count : 0n00x02c should_lock_elevation : 0n00x030 elevation_locked_count : 0n00x034 elevation_reduced : 0n00x038 minimal_gc       : 0n00x03c reason           : 0 ( reason_alloc_soh )0x040 pause_mode       : 1 ( pause_interactive )0x044 found_finalizers : 0n00x048 background_p     : 0n00x04c b_state          : 0 ( bgc_not_in_process )0x050 allocations_allowed : 0n10x054 stress_induced   : 0n00x058 entry_memory_load : 00x05c exit_memory_load : 0其实 reinterpret_cast 大概也是干这个事的参考代码如下:typedef struct _Point {int x;int y; } Point;int main() {Point point  { 10,11 };//内存地址void* ptr  point;//根据内存地址 丈量出  PointPoint* ptr_point  reinterpret_castPoint*(ptr);printf(x%d, ptr_point-x); }从代码看我直接根据 ptr 地址丈量出了 Point 结构说实话这个和 C 玩法就比较类似了。3. dynamic_cast在多态场景下有时候会遇到这样的一个问题一个父类有多个子类我现在手拥一个父类我不知道能不能将它转换为其中一个子类要试探一下看看那怎么去试探呢类似 C# 中的 as 运算符在 C 中就需要用 dynamic_cast  来做这件事情参考如下//点 class Point { public:Point(int x, int y) :x(x), y(y) {}virtual void show() {} public:int x;int y; };//矩形 class Rectangle :public Point { public:Rectangle(int x, int y, int w, int h) : Point(x, y), w(w), h(h) {} public:int w;int h; };//三角形 class Triangle :public Point { public:Triangle(int x, int y, int z) :Point(x, y), z(z) {} public:int z; };int main() {Point* p1  new Rectangle(10, 20, 100, 200);Point* p2  new Triangle(4, 5, 6);//将  p1 转成 子类 Triangle 会报错的Triangle* t1  dynamic_castTriangle*(p1);if (t1  nullptr) {printf(p1 不能转成 Triangle);} }对场景就是这个p1 其实是 Rectangle 转上去的 这时候你肯定是不能将它向下转成 Triangle 问题就在这里很多时候你并不知道此时的 p1 是哪一个子类。接下来的一个问题是C 并不像C# 有元数据那它是如何鉴别呢其实这用了 RTTI 技术哪里能看出来呢哈哈看汇编啦。Triangle* t1  dynamic_castTriangle*(p1); 00831D57  push        0   00831D59  push        offset Triangle RTTI Type Descriptor (083C150h)   00831D5E  push        offset Point RTTI Type Descriptor (083C138h)   00831D63  push        0   00831D65  mov         eax,dword ptr [p1]   00831D68  push        eax   00831D69  call        ___RTDynamicCast (083104Bh)   00831D6E  add         esp,14h   00831D71  mov         dword ptr [t1],eax从汇编可以看到编译器这是带夹私货了在底层偷偷的调用了一个 ___RTDynamicCast 函数在运行时帮忙检测的根据 cdcel 调用协定参数是从右到左恢复成代码大概是这样。___RTDynamicCast(p1, 0, Point, Triangle,0)3. static_cast从名字上就能看出这个强转具有 static 语义也就是 编译阶段 就生成好了具体安全不安全它就不管了就拿上面的例子将 dynamic_cast 改成 static_cast 看看有什么微妙的变化。int main() {Point* p1  new Rectangle(10, 20, 100, 200);Point* p2  new Triangle(4, 5, 6);Triangle* t1  static_castTriangle*(p1);printf(x%d, y%d,z%d, t1-x, t1-y, t1-z); }我们发现居然转成功了而且 Triangle 的值也是莫名奇怪直接取了 Rectangle 的前三个值如果这是生产代码肯定要挨批了。。。接下来简单看下汇编代码Triangle* t1  static_castTriangle*(p1); 00DF5B17  mov         eax,dword ptr [p1]   00DF5B1A  mov         dword ptr [t1],eax  printf(x%d, y%d,z%d, t1-x, t1-y, t1-z); 00DF5B1D  mov         eax,dword ptr [t1]   00DF5B20  mov         ecx,dword ptr [eax0Ch]   00DF5B23  push        ecx   00DF5B24  mov         edx,dword ptr [t1]   00DF5B27  mov         eax,dword ptr [edx8]   00DF5B2A  push        eax   00DF5B2B  mov         ecx,dword ptr [t1]   00DF5B2E  mov         edx,dword ptr [ecx4]   00DF5B31  push        edx   00DF5B32  push        offset string x%d, y%d,z%d (0DF8C80h)   00DF5B37  call        _printf (0DF145Bh)   00DF5B3C  add         esp,10h从代码中看它其实就是将 p1 的首地址给了 t1然后依次把copy偏移值 4,8,0C 除了转换这个还可以做一些 int long double 之间的强转当然也是一样编译时汇编代码就已经生成好了。好了本篇就说这么多希望对你有帮助。
http://www.yutouwan.com/news/286334/

相关文章:

  • 石家庄专业网站设计电话域名状态查询工具
  • 网站按钮设计成什么颜色原因wordpress备份恢复.wpress
  • 室内设计图网站有哪些苏州市建设厅网站首页
  • 招远市建设局网站百度推广营销方案
  • 什么网站可以做软件有哪些东西张家界网站建设的公司
  • php个人网站怎么做连云港公司做网站
  • 网站建设找好景科技汕头seo代理商
  • 做餐饮酒店网站wordpress首页名称
  • 济南网站设计制作要多久网站建设应注意什么
  • 百度双站和响应式网站的区别深圳工作服制作
  • wordpress公式编辑器宁波优化seo软件公司
  • 提交网站收录入口网站开发天津网站开发
  • 自建社区网站10大营销理论
  • 江门北京网站建设廊坊建站模板系统
  • dw做网站怎么跳转网站运营与公司简介
  • 中国建设银行官网站纪念币预约ps做任务挣钱的网站
  • 建立学校网站需要多少钱?wordpress 内容 只调图片大小
  • 高端营销型网站建设品牌搜索引擎seo优化怎么做
  • 网站建设90g 吾爱破解用html5做的商务网站
  • 广州新建站房产中介网站建设的目的
  • 网站过程中遇到问题东莞室内设计公司
  • 专业网站设计制作服务企业一般用哪个erp系统
  • ui图标素材网seo外链在线提交工具
  • 微信公众号免费做影视网站北京西站到北京南站
  • 梅州建站公司做行业网站能赚钱吗
  • 濮阳做网站的价格近一周新闻热点事件
  • 深圳宝安商城网站建设公司天津建设网站安全员考试成绩查询
  • 做网站免费服务器哪家好php网站文件下载怎么做
  • 内链好的网站柳州做网站那家好
  • 营销型网站建设步骤百度竞价推广方案的制定