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

大连企业招聘网站西安网站设计 牛人网络

大连企业招聘网站,西安网站设计 牛人网络,wordpress侧边栏作者,做网站如何挑选服务器对象工厂替代方案 一般,需要无需用模块构造器触发d运行时的挑剔循环检测的方法来注册工厂.很多时候,混合模块构造器正是想要方法,但它有全局全开或全闭的循环检测算法. 要全局关闭它,请在Main文件中,添加以下代码行: extern(C) __gshared string[] rt_options ["oncycl…

对象工厂替代方案

一般,需要无需用模块构造器触发d运行时挑剔循环检测的方法来注册工厂.很多时候,混合模块构造器正是想要方法,但它有全局全开或全闭循环检测算法.
全局关闭它,请在Main文件中,添加以下代码行:

extern(C) __gshared string[] rt_options = ["oncycle=ignore"];

运行程序时传递--DRT-oncycle=ignore开关.
但是,如果正在制作库,则可能不想全局关闭它,因为会破坏事物.你想要更局部的方法.
唉,D当前的模块构造器没有提供在局部说"这很好,相信我"的方法.可在模块信息构造器列表中添加新数组来实现它,根据是否标记循环安全,来分离它们.

目前,编译器组合模块的所有静态构造器到一个调用所有构造器生成函数中.然后ModuleInfo引用此生成函数,以便初化时druntime调用它.需要两个生成函数,一个当前行为,另一个顺序无关运行.

应该添加它到语言中.

但是今天可做什么呢?
好吧,用ldcgdc,可在自定义链接器节中放引用函数,如果看看ModuleInfo实现,它也是这样.(在某些平台上,它查找可执行文件中的.minfo节,在其他平台上,它发出调用特定的D注册函数的crt构造器).但是crt构造器如何实现的呢?通过带指针链接器节!

事实上,用crt构造器是一个可能.发出其中一个,它会构建一个列表,然后稍后从普通D模块构造器调用该列表.不过,必须小心从crt构造器调用的内容,-druntime已出来了,甚至C运行时的其他部分,可能还没有完全初化,可能还有共享库加载锁.
有个优先级编号,但D禁止你设置该编号.即使你可以设置,它也不能解决所有问题.我相信当前的实现确实可让你侥幸调用realloc,所以这是可相当安全构建列表方式.只要不乱搞,你没事.

但,我想深入链接器节.转储代码:

module sections.demo;
import core.internal.elf.io;
import sections.demo2;//用此注册处理器
mixin template Register(alias fn) {import ldc.attributes;@section(".mytest") __gshared void function() registered = &fn;
}//必须注册`挂名`来欺骗链接器,在此搞一个
void specialCtor() {import std.stdio;writeln("hello special ctor");
}
mixin Register!specialCtor;// impl来取它
alias SectionDataHandler = void function(scope const(ubyte)[] data);int findSectionInfo(SectionDataHandler handler) {import core.internal.elf.dl;SharedObject exe = SharedObject.thisExecutable();ElfFile file;if(!ElfFile.open(exe.name.ptr, file))return 1;foreach(index, name, sectionHeader; file.namedSections) {if(name == ".mytest") {if(auto offset = sectionHeader.shdr.sh_addr) {auto beg = exe.baseAddress + offset;auto size = sectionHeader.shdr.sh_size;auto data = beg[0 .. size];//愚蠢无用的`NOGC`限制我,仅当体为`NOGC`,可标记`NOGC`alias BypassAttribute = void function(scope const(ubyte)[]) @nogc nothrow;(cast(BypassAttribute) handler)(cast(ubyte[]) data);} else {// 未映射}}}return 0;
}void main() {import std.stdio;// 从列表中调用函数static void handler(scope const(ubyte)[] data) {//必须引用`神奇节`中的一个变量,否则`--gc-sectionsarg`默认链接器会去掉它!auto reference = registered;reference();auto fns = cast(void function()[]) data;foreach(fn; fns) {// 不要重复调用根引用if(fn is reference)continue;fn();}}writeln(findSectionInfo(&handler));
}

还有第二个文件注册了:

module sections.demo2;
import sections.demo;
void otherCtor() {import std.stdio;writeln("here too");
}mixin Register!otherCtor;

注意,我用了ldc.attributes,所以该演示只是LDC,但gdc.attributes工作方式相同,所以可很容易地支持这两个编译器.不过,DMD现在没用.

编译并运行它(仅在Linux上测试!也应该在BSD上运行,但Mac微软等需要进一步调整):

$ ldc2 -i=core.internal.elf sections.d sections2.d  && ./sections
hello special ctor
here too
0

注意,我用-i=core.internal.elf来引入该ElfFile类型.否则,不会在构建包含它(编译器假定,因为它是druntime的一部分,它预编译在库中,但也可能没有这些指定的,加它至构建使它更易工作).

否则,只需基本编译和运行,就运行了.

在此基础上创建东西,就像如果注册一个变量,可自动生成附加它到数组的函数.或,可设置该节自身为特定类型而不是函数列表,且直接不运行就用它;链接器节只是提前连接的静态数据,因此无需进一步操作,可切片并转换为另一个类型并用它.
甚至可这样注册http路由等,且知道在可执行文件中查找哪个节的特定检查器,甚至可不运行程序就打印出它们!
可用静态数据做很多很酷的,可执行文件节是进入该世界的窗口.

http://www.yayakq.cn/news/530567/

相关文章:

  • 如何做网站出单网络服务商主要包括哪些方面
  • 重庆企业网站开发服务器网站建设信息推荐
  • 腾博会的网站是什么网站建设世纪明珠
  • 怎么做化妆品网站内容规划网站开发项目经验怎么写
  • 龙华做棋牌网站建设多少钱wordpress横排菜单
  • 网站开放培训普通话的顺口溜6句
  • 怎么做微信网站吗网站页面怎么算
  • 太原网站seo服务石家庄网站建设公司黄页
  • wordpress找人做织梦网站优化
  • 网站建站请示网站改版竞品分析怎么做
  • 石家庄网站建设seo公司在线长图生成器
  • 网站优化营销商标设计logo图案设计软件
  • 云南省城乡住房建设厅网站免费推广
  • 虚拟货币网站建设小米的网站建设的要点
  • 建设监理协会官方网站室内装修设计联盟
  • 金湖网站设计甘肃省住房和城乡建设厅网站
  • 哪里有建设哪里有我们怎么提高网站seo优化关键字排名
  • 常州网站设计专业建设工作计划
  • o2o手机网站建设难动态设计是什么意思
  • 建设网站需要学什么南京网站设计外包
  • sql2008做网站网页设计淘宝首页html代码
  • 高端网站建设 n磐石网络腾讯云网站免费建设
  • 南阳网站网站建设做天然文化石的网站
  • 比较好的商城网站设计怎样在赶集微网站做微招聘信息
  • 网站栏目页关键词如何做北京市住房建设网站
  • 什么网站可以找到做餐饮的会计wordpress转移服务器后不能访问
  • 杭州手机网站建设美图秀秀网页版在线制作
  • 自己做的网页怎么上传到网站做ui要上那些网站
  • 做外贸必看的网站和论坛有哪些深圳市建设工程合同备案网站
  • 福州市城乡建设网站张麒蛰top域名