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

d亚当替换工厂模式

对象工厂替代方案

一般,需要无需用模块构造器触发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路由等,且知道在可执行文件中查找哪个节的特定检查器,甚至可不运行程序就打印出它们!
可用静态数据做很多很酷的,可执行文件节是进入该世界的窗口.

相关文章:

d亚当替换工厂模式

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

Real-time Scene Text Detection with Differentiable Binarization

Abstract 近年来,基于分割的方法在文本检测场景中非常流行,因为分割结果可以更准确地描述曲线文本等各种形状的场景文本。然而,二值化的后处理对于分割检测是必不可少的,它将分割方法产生的概率图转换为文本框/区域。本文提出了一…...

国外客户只想跟工厂合作?可以这样破解

1.客户是愿意和外贸公司合作还是更愿意和工厂合作?一个外贸公司的朋友说:“我去工厂接待过七八次外国人,基本上都是英国、德国、日本、加拿大、美国的。”贸易公司根本不避讳自己是贸易公司,外国人也不在乎。他们更关心的是贸易公司能否妥善安…...

c++重中之重:“换个龟壳继续套娃“:运算符重载等的学习

文章目录 前言一.运算符重载二.const成员三.取地址重载总结前言 上一期我们讲到类的6个默认构造函数中的拷贝构造函数,这一期我们继续往下讲,当然难点肯定是运算符重载了。 一、运算符重载 运算符重载是c为了增强代码的可读性引入了运算符重载&#xf…...

RabbitMQ简单使用

这篇文章通过一个最简单的例子,让初学者能了解RabbitMQ如何完成生产消息和消息的。 所有的程序员在学习一门新技术的时候,都是从 Hello World 进入到Colorful World的,本节也将按照惯例,从HelloWorld开始,演示RabbitMQ…...

Lambda表达式

👌 棒棒有言:也许我一直照着别人的方向飞,可是这次,我想要用我的方式飞翔一次!人生,既要淡,又要有味。凡事不必太在意,一切随缘,缘深多聚聚,缘浅随它去。凡事…...

JSON数据格式【学习记录】

JSON介绍 JSON(JavaScript Objet Notation)是一种轻量级的数据交换格式。它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。它采用一种键:值对的文本格式来存储和表示数据,在系统交换数据过程中常常被使用,是…...

LeetCode——1234. 替换子串得到平衡字符串

一、题目 有一个只含有 ‘Q’, ‘W’, ‘E’, ‘R’ 四种字符,且长度为 n 的字符串。 假如在该字符串中,这四个字符都恰好出现 n/4 次,那么它就是一个「平衡字符串」。 给你一个这样的字符串 s,请通过「替换一个子串」的方式&a…...

Web自动化测试——selenium篇(二)

文章目录一、浏览器相关操作二、键盘操作三、鼠标操作四、弹窗操作五、下拉框选择六、文件上传七、错误截图一、浏览器相关操作 浏览器窗口大小设置 driver.manage().window().maximize();//窗口最大化 driver.manage().window().minimize();//窗口最小化 driver.manage().wi…...

RK3399平台开发系列讲解(文件系统篇)虚拟文件系统的数据结构

🚀返回专栏总目录 文章目录 一、超级块二、挂载描述符三、文件系统类型四、索引节点五、目录项沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍虚拟文件系统的数据结构。 一、超级块 文件系统的第一块是超级块,用来描述文件系统的总体信息。当我们把文件系…...

企业财务管理升级,智慧税务和数据可视化打造新标准

一、引言在发展社会主义市场经济的过程中,税收承担着组织财政收入、调控经济、调节社会分配的职能。中国每年财政收入的90%以上来自税收,其地位和作用越来越重要,可称之为国家经济的“晴雨表”,有效进行税务管理、充分挖掘税务大数…...

JFET(结型场效应管)

JFET的结构示意图 参考:https://blog.csdn.net/weixin_45882303/article/details/106008695 下图是实际结构图, 下面是原理图和符号表示(参考连接中的图片) 分析 VGS 对电压id的控制(固定VDS) 当让D和…...

oceanbase部署--使用OBD部署obagent和promethous_grafana软件

obagent OBAgent 通常部署在 OBServer 节点上。OBAgent支持推、拉两种数据采集模式,可以满足不同的应用场景。 OBAgent默认支持的插件包括主机数据采集、OceanBase 数据库指标的采集、监控数据标签处理和 Prometheus 协议的 HTTP 服务。 1)编辑 OBAgent …...

浏览器广告拦截插件| 浏览器搜索广告横飞怎么办

文章目录浏览器广告拦截插件| 浏览器搜索广告横飞怎么办一、效果二、安装浏览器广告拦截插件| 浏览器搜索广告横飞怎么办 浏览器广告横飞怎么办?今天教你一招解决!很多小伙伴说自己用的浏览器总是有广告。 今天咱们就针对这个问题分享一个浏览器插件&a…...

Redis优化内存篇

【内存消耗】 场景:业务ID->图片ID(KV:partnerId->objectId)。 刚开始,我们保存了1亿张图片,大约用了6.4GB的内存。 随着图片数据量的不断增加,Redis变慢了。 新的认知:String类型并不是适…...

Vue原理解析

文章目录1. VUE的响应式原理1.1 ViewModel1.2 双向绑定的基本原理1.3 什么是响应性1.4 Vue 中的响应性是如何工作的2. Vue 渲染机制2.1 虚拟 DOM2.2 渲染管线2.3 带编译时信息的虚拟 DOM2.3.1 静态提升2.3.2 修补标记 Flags2.3.3 树结构打平2.3.4 对 SSR 激活的影响1. VUE的响应…...

C# Lambda表达式含义及各种写法

Lambda表达式在各个语言中的表达方式都不太相同,本文重点介绍C#的Lambda表达式。 首先,Lambda表达式就是一个匿名的方法/函数。 以下面的一个完整版作为例子,前面是参数,后面是返回值: 由于 Lambda表达式和委托常常一起…...

计算机组成原理:1. 计算机系统概论

更好的阅读体验\huge{\color{red}{更好的阅读体验}}更好的阅读体验 文章目录1.1 计算机系统简介1.1.1 计算机软硬件概念1.1.2 计算机的层次1.1.3计算机组成和计算机体系结构1.2 计算机的基本组成1.2.1 冯诺伊曼计算机的特点1.2.2 计算机的硬件框图1.2.3 计算机的工作步骤1.3 计…...

【c#】c#常用小技巧方法整理(5)—— 字符串操作类

1、GetStrArray(string str, char speater, bool toLower) 把字符串按照分隔符转换成 List 2、GetStrArray(string str) 把字符串转 按照, 分割 换为数据 3、GetArrayStr(List list, string speater) 把 List 按照分隔符组装成 string 4、GetArrayStr(List list) 得到数组列表以…...

用队列实现栈VS用栈实现队列

之前我们就讲过队列,栈的基础知识,笔者之前有过详细的介绍,感兴趣的可以根据笔者的个人主页进行查找:https://blog.csdn.net/weixin_64308540/?typelately225. 用队列实现栈请你仅使用两个队列实现一个后入先出(LIFO&…...

MY2480-16P语音模块的使用

MY2480-16P语音模块的使用开发环境:STM32CUBEMXKEIL5辅助软件:串口助手、迅捷文字转语音一、MY2480-16P语音模块引脚图及引脚定义二、选择触发方式三、使用串口控制MY2480-16P语音模块四、模块使用指南开发环境:STM32CUBEMXKEIL5 辅助软件&a…...

I/O 多路复用

。新到来一个 TCP 连接,就需要分配一个进程或者线程,那么如果要达到 C10K,意味着要一台机器维护 1 万个连接,相当于要维护 1 万个进程/线程,操作系统就算死扛也是扛不住的。 一个进程虽然任一时刻只能处理一个请求&…...

2023 最新版网络安全保姆级指南,从0到1,建议收藏!

一、网络安全学习的误区 1.不要试图以编程为基础去学习网络安全 不要以编程为基础再开始学习网络安全,一般来说,学习编程不但学习周期长,且过渡到网络安全用到编程的用到的编程的关键点不多。一般人如果想要把编程学好再开始学习网络安全往…...

力扣39.组合总数

文章目录力扣39.组合总数题目描述方法1:深搜回溯力扣39.组合总数 题目描述 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可…...

sql的case when用法详解

简单CASE WHEN函数: CASE SCORE WHEN A THEN 优 ELSE 不及格 END CASE SCORE WHEN B THEN 良 ELSE 不及格 END CASE SCORE WHEN C THEN 中 ELSE 不及格 END等同于,使用CASE WHEN条件表达式函数实现: CASE WHEN SCORE A THEN 优WHEN SCORE …...

AtCoder Grand Contest 061(题解)

A - Long Shuffle 这道题本质是一个找规律的题 既然是打表题,我们先暴力把他打出来 (盗一张图.jpg) 接下来就是在这张图中挖掘答案 我们可以明显的看到偶数行是有一些规律的 要么是相邻对的互换,要么不变 不变和互换的位置也有讲究,在二进制…...

生成系列论文:文本控制的3d点云生成 TextCraft(一):论文概览

TextCraft: Zero-Shot Generation of High-Fidelity and Diverse Shapes from Text 论文原文: https://arxiv.org/abs/2211.01427 论文的研究动机 DALL2已经在文本控制的图像生成上取得很好的效果,但是基于文本控制的3d点云生成的研究还不太成熟&#…...

IDEA常用插件

常用IDEA插件 Codota 插件下载地址:Codota AI Autocomplete for Java and JavaScript - IntelliJ IDEs Plugin | Marketplace IDEA的自动补全功能已经很强大了,但是这个插件的自动补全功能更加强大,这是一个基于AI技术,学习了大量…...

Spring的事务传播机制

多个事务方法相互调用时,事务如何在这些方法之间进行传播,Spring中提供了七种不同的传播机制,来保证事务的正常执行: REQUIRED:默认的传播机制,如果存在事务,则支持/加入当前事务,如…...

Python:路径之谜(DFS剪枝)

题目描述 小张冒充 X 星球的骑士,进入了一个奇怪的城堡。 城堡里边什么都没有,只有方形石头铺成的地面。 假设城堡地面是 nn 个方格。如下图所示。 按习俗,骑士要从西北角走到东南角。可以横向或纵向移动,但不能斜着走&#xf…...

广州正规网站建设企业/百度推广账号怎么申请

http://tool.oschina.net/...

哪个网站做校招/网络优化工程师骗局

算法,即解决问题的方法。同一个问题,使用不同的算法,虽然得到的结果相同,但是耗费的时间和资源是不同的。 时间复杂度的计算 计算一个算法的时间复杂度,不可能把所有的算法都编写出实际的程序出来让计算机跑&#xf…...

怎么免费从网站上做宣传/百度推广网址

学编程要简单、粗暴。更要有效,很多时候学的越多,忘得越快。但编程总有那么一天顿悟的时候,而顿悟的契机目前就是建立在你跟橡皮擦坚持打卡 100 天,在评论区坚持跟橡皮擦卡学习的朋友,在 100 天之后,橡皮擦将送出 神秘大奖。 已完成的文章 标题链接1. 这才是 Python 学习…...

专业的手机网站建设/陕西优化疫情防控措施

RSA公钥加密算法实验实验报告 使用说明 编译运行 将myRSA.cpp用C编译器编译,得到可执行程序myRSA.exe,运行可执行程序myRSA.exe。得到如下的选择界面: 使用 在编译运行后,需要输入进行选择操作,有以下几种选项&am…...

php做网站要用到的技术/seo属于什么职位类型

var testString "There are 3 cats but 4 dogs."; var expression /\d/g; var digitCount testString.match(expression).length; //特殊选择器中的一种就是数字选择器\d,意思是被用来获取一个字符串的数字。 //在JavaScript中, 数字选择器类似于: /\d…...

昭通昭阳区城乡建设管理局网站/百度实时热点排行榜

想要在MYSQL的触发器中调用存储过程,但是IDE提示:0A000 Not allowed to return a result set from a trigger触发器代码如下:DELIMITER $$CREATE TRIGGER tri_ContactCompany_Insert AFTER INSERTON contactcompany FOR EACH ROW# 创建时间&a…...