1.lldb 小记和std::string的记日记日数据结构【】【源码阅读】
2.如何用记事本编程
3.slate.js源码分析(四)- 历史记录机制
4.记事本怎么造句
lldb 小记和std::string的数据结构【】【源码阅读】
在深入理解LLVM和GCC的std::string实现差异时,我们首先从lldb着手,源码探索其内部工作机制。小程序昨天尝试编译llvm后,记日记日今天我们就来研究std::string在lldb中的源码表现,它与g++的小程序cnodejs源码std::string实现有何不同。
从一个简单的记日记日测试程序开始,我们对比了用g++和clang++编译的源码代码。在g++版本中,小程序字符串s使用了短字符串优化(SSO)的记日记日存储方式,"hi"存储在_M_local_buf中。源码SSO旨在节省内存,小程序通过为短字符串预留固定大小的记日记日结构,如长度、源码容量和指向字符串数组的小程序指针,共字节。
对于长字符串,例如scow,存储方式不同。尽管_M_local_buf中没有"this is a sunny day",但通过M p找到的实际字符串地址显示出长字符串的存储策略。这表明在长字符串时,std::string会采用常规的存储方式,即一个指针指向字符串数组。
接下来,我们需要弄清楚如何判断何时使用SSO。在代码中,我们猜测可能通过某些标志位来区分,但实际观察到的operator[]函数表明,M p始终指向字符串数组,不论字符串长度。这就意味着,无论短长,读取指定位置的字符都遵循相同的逻辑。
在libstdc++(g++)和libc++(llvm)的实现上,我们发现两者在数据结构上存在差异。例如,libstdc++的std::string使用字节的union,而libc++则为字节。极致源码区分长短字符串的方式在libc++中通过检查容量字段的比特位实现,这依赖于机器的字节序。
附录中,我分享了自己编译LLVM的体验和使用clang++编译程序的CMakeLists.txt设置,供有兴趣的读者参考。
如何用记事本编程
跟我学做记事本-编程实例
用VB做一个记事本实在不很复杂,我们完全可以通过向导来很方便地做出来。但本文只打算讨论用手动方法制作记事本,旨在向VB初学者展示:学VB原来是如此容易!
通过阅读、研究本文并按本文所述进行尝试,初学者将学到很多东西,如怎样使用RichText控件来打开和保存文件,怎样制作菜单、工具栏和状态栏以及如何对其编写代码等。
第一章 让我们的记事本马上运行
急于求成是初学者共有的心愿。那好,请按如下三个步骤做,我们的愿望立即就可以实现!
步骤一:绘制界面。
新建一个标准EXE工程,将其Caption属性改为“超级记事本”,点击Icon属性给它找个合适的Icon图标。单击菜单“工程”-“部件”,在弹出的“部件”对话框里找到Microsoft
RichText Box 6.0和公共对话框Microsoft Common Dialog 6.0并选中它们,单击“确定”按钮。这时左边的工具栏上出现了我们刚才新添的两个控件了。在窗体上绘制RichText
Box和Commn Dialog,其中RichText Box的大小和位置可不用理睬,我们将在代码中处理它,当然,有必要把它的ScrollBar属性设为2-rtfVertical,这样在打开和编辑文件时垂直滚动条才可用。
步骤二:编辑菜单。
按Ctrl+E调出菜单编辑器,我们来做如下几个菜单:
一.文件菜单:
文件(第一层) mnuFile
新建(第二层) mnuNew
打开(第二层) mnuOpen
保存(第二层) mnuSave
- (第二层) mnuFileSep (分隔线)
退出(第二层) mnuExit
二.编辑菜单:
编辑(第一层) mnuEdit
复制(第二层) mnuCopy
剪切(第二层) mnuCut
粘贴(第二层) mnuPaste
- (第二层) mnuEditSep (分隔线)
全选(第二层) mnuSelecAll
三.搜索菜单:
搜索(第一层) mnuSearch
查找(第二层) mnuFind
查找下一个(第二层) mnuFindOn
四.帮助菜单:
帮助(第一层) mnuHelp
使用说明(第二层) mnuUsage
关于(第二层) mnuAbout
(注:各菜单项的快捷键请自行设置)
好了,其它的菜单项以后再根据需要添加。现在进入:
步骤三:编写代码。
'声明查找变量
Dim sFind As String
'声明文件类型
Dim FileType,GMR源码 FiType As String
'初始化程序
Private Sub Form_Load()
'设置程序启动时的大小
Me.Height =
Me.Width =
End Sub
'设置编辑框的位置和大小
Private Sub Form_Resize()
On Error Resume Next '出错处理
RichTextBox1.Top=
RichTextBox1.Left=
RichTextBox1.Height = ScaleHeight-
RichTextBox1.Width = ScaleWidth-
End Sub
'新建文件
Private Sub mnuNew_Click()
RichTextBox1.Text = "" '清空文本框
FileName = "未命名"
Me.Caption = FileName
End Sub
'打开文件
Private Sub mnuOpen_Click()
CommonDialog1.Filter = "文本文档(*.txt)|*.txt|RTF文档(*.rtf)|*.rtf|所有文件(*.*)|*.*"
CommonDialog1.ShowOpen
RichTextBox1.Text = "" '清空文本框
FileName = CommonDialog1.FileName
RichTextBox1.LoadFile FileName
Me.Caption = "超级记事本:" & FileName
End Sub
'保存文件
Private Sub mnuSave_Click()
CommonDialog1.Filter = "文本文档(*.txt)|*.txt|RTF文档(*.rtf)|*.rtf|所有文件(*.*)|*.*"
CommonDialog1.ShowSave
FileType = CommonDialog1.FileTitle
FiType = LCase(Right(FileType, 3))
FileName = CommonDialog1.FileName
Select Case FiType
Case "txt"
RichTextBox1.SaveFile FileName, rtfText
Case "rtf"
RichTextBox1.SaveFile FileName, rtfRTF
Case "*.*"
RichTextBox1.SaveFile FileName
End Select
Me.Caption = "超级记事本:" & FileName
End Sub
'退出
Private Sub mnuExit_Click()
End
End Sub
'复制
Private Sub mnuCopy_Click()
Clipboard.Clear
Clipboard.SetText RichTextBox1.SelText
End Sub
'剪切
Private Sub mnuCut_Click()
Clipboard.Clear
Clipboard.SetText RichTextBox1.SelText
RichTextBox1.SelText = ""
End Sub
'全选
Private Sub mnuSelectAll_Click()
RichTextBox1.SelStart = 0
RichTextBox1.SelLength = Len(RichTextBox1.Text)
End Sub
'粘贴
Private Sub mnuPaste_Click()
RichTextBox1.SelText = Clipboard.GetText
End Sub
'查找
Private Sub mnuFind_Click()
sFind = InputBox("请输入要查找的字、词:", "查找内容",
sFind)
RichTextBox1.Find sFind
End Sub
'继续查找
Private Sub mnuFindOn_Click()
RichTextBox1.SelStart = RichTextBox1.SelStart + RichTextBox1.SelLength + 1
RichTextBox1.Find sFind, , Len(RichTextBox1)
End Sub
'使用说明
Private Sub mnuReadme_Click()
On Error GoTo handler
RichTextBox1.LoadFile "Readme.txt", rtfText '请写好Readme.txt文件并存入程序所在文件夹中
Me.Caption = "超级记事本:" & "使用说明"
Exit Sub
handler:
MsgBox "使用说明文档可能已经被移除,请与作者联系。",
vbOKOnly, " 错误信息"
End Sub
'关于
Private Sub mnuAbout_Click()
MsgBox "超级记事本 Ver1.0 版权所有(C) 土人",vbOKOnly,"关于"
End Sub
'设置弹出式菜单(即在编辑框中单击鼠标右键时弹出的动态菜单)
Private Sub RichTextBox1_MouseDown(Button As Integer, Shift As Integer, X As
Single, Y As Single)
If Button = 2 Then
PopupMenu mnuEdit, vbPopupMenuLeftAlign
Else
Exit Sub
End If
End Sub
'防止在切换输入法时字体自变(感谢王必成先生提供此方案)
Private Sub RichTextBox1_KeyUp(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeySpace Then
RichTextBox1.SelFontName = CommonDialog1.FontName
End If
End Sub
至此,我们的记事本可以编译使用了。点击菜单“文件”-“生成XXX.EXE”,回到桌面运行我们的记事本看看,是不是颇有成就感?
当然,这样的记事本还比较粗糙,我们还需要做些工作,请看下一章。
第二章 美化程序界面
多数字处理软件都有工具栏和状态栏。工具栏和状态栏除了能美化我们的程序使其更具有专业性质外,还给用户带来操作上的便利。现在我们就来做一做这两样东西。
一.工具栏
(一)制作工具栏
单击“工程”-“部件”,选中Microsoft Windows Common Control 6.0并确定。这时,我们要用到的控件就出现在左边的工具栏上了。
要做工具栏,首先需要一个叫ImageList的控件来装载图像。在程序界面上添加它,然后右键单击此控件,左键单击“属性”,弹出“属性页”对话框的“图像”,再单击“插入”就可以一次性装载了(如不满意,以后还可以添加)。可在C:Microsoft
Visual StudioCommonGraphicsBitmapsTlBr_W下选择(这里假设你的VB安装在C盘下)。注意了:在插入时给每一张注明关键字,以便在引用时不至于混乱。如插入“新建”的,我们在“关键字”栏注明“New”。
有了,接下来在程序界面添加工具栏(ToolBar)。添加后工具栏就出现在菜单下面,右键单击它,选择“属性”,在弹出的“属性页”对话框中的“通用”项作些设置,主要如下两项:
1.“图像列表”:选择ImageList1
2.“样式”:根据喜爱选择1-trbStandard或者2-trbFlat
继续点击“属性页”的“按钮”选项,插入若干按钮。源码分红按钮有多种样式,请根据需要设置。这里请一定注意:每一个与用户操作有关的按钮都必须注明关键字、装载,如“新建”按钮,在“关键字”项注明“新建”,在“图像”项键入“New”(即ImageList1中的关键字),需要的话还可以在“工具提示文本”项填入适当的提示语。
(二)编写工具栏的按钮代码
工具栏按钮的代码编辑很简单,可以按照下面的格式去编写:
Private Sub ToolBar1_ButtonClick(ByVal Button As MSComctlLib.Button)
On Error Resume Next '出错处理
Select Case Button.Key '按关键字选择
Case "新建"
mnuNew_Click '等于菜单项“新建”被单击
Case "打开" '等于菜单项“打开”被单击
mnuOpen_Click
'......(继续编写其它按钮的代码)
End Select
End Sub
完成后试运行一下我们的程序,我们发现,有了工具栏之后,程序变得漂亮多了,只是有一个问题:打开一个较长的文档后,编辑框的下拉滚动条向上的箭头不见了。原因是:工具条占用一定的空间。解决方法:将“设置编辑框的位置和大小”中的RichTextBox1.Top
= 和 RichTextBox1.Height = Me.ScaleHeight - 分别改为RichTextBox1.Top =
,RichTextBox1.Height = Me.ScaleHeight - 即可。
二.状态栏
(一)制作状态栏
状态栏的英文名字叫StatusBar,在窗体上添加它后会默认出现在窗体的最下方。用鼠标右键点击它,调出“属性页”对话框,单击“窗格”项,插入一些窗格,可以将各个窗格的“样式”设置为:
0-sbrText 显示文本,需编写代码
1-sbrCaps 显示大小写状态,无需编程
2-sbrNum 显示NumLock键开关状态,无需编程
3-sbrIns 显示Insert键状态,无需编程
4-sbrScr1
5-sbrTime 显示时间,不编程时时间不会随系统时钟变化
6-sbrDate 显示日期,无需编程
注意:加进状态栏后需将Form_Resze中的RichTextBox1.Height =
Me.ScaleHeight - 改为RichTextBox1.Height = Me.ScaleHeight - 。
(二)状态栏根据其“样式”属性决定用不用编写代码(如上文所述)。下面举些例子,读者可以认真揣摩,从而达到举一反三的效果。
例一:用户选取了“新建”后,让第一个窗格显示:“目前状态:正在打开文件《……》”。请将下面代码写进“打开”菜单里面:
StatusBar1.Panels(1).Text = "目前状态:正在打开文件"
& "《" &CommonDialog1.FileTitle & "》"
例二:让第三个窗格显示时间并让时间跟随系统时钟变化。
首先,数码源码给程序加一个Timer控件,将其Interval属性设为。然后:
在Form_Load过程加入:StatusBar1.Panels(1).Text = Time;然后给Timer控件编写代码:
Private Sub Timer1_Timer()
If StatusBar1.Panels(3).Text <> CStr(Time) Then
StatusBar1.Panels(3).Text = Time
End If
End Sub
例三:当编辑框的文本发生变化时让第一个窗格显示:“正在编辑文档:文件名”。
Private Sub RichTextBox1_Chang()
StatusBar1.Panels(1).Text = "正在编辑文档:" &
CommonDialog1.FileName
End Sub
辛苦了那么久,我们现在已经拥有一个象模象样的记事本了。这个记事本由于用了RichText控件,理论上它能打开和编辑任意大的文档,使用起来的确比Windows自带的记事本方便得多。当然,还有一些其它的功能需要添加和完善,这就靠你慢慢去完成了。
slate.js源码分析(四)- 历史记录机制
应用中常见撤销与重做功能,尤其在编辑器中,其实现看似简单却也非易事。为了更好地理解这一机制,本文将深入探讨 MVC 设计模式,并聚焦于 slate.js 如何巧妙地实现撤销与重做功能。
MVC 模式是一种经典的软件架构模式,自 年提出以来便广为应用。在 MVC 模式中,模型(Model)负责管理数据,视图(View)展示数据,而控制器(Controller)则负责处理用户输入与模型更新。
在撤销与重做功能的设计中,通常有两种实现思路。其中一种是通过 Redux 等状态管理库实现,而 slate.js 则采用了一种更为直接的方法。本文将重点介绍 slate.js 的实现策略。
撤销功能允许用户回溯至之前的页面状态,而重做功能则让用户能够恢复已撤销的操作。在执行操作后,当用户请求撤销时,系统会抛弃当前状态并恢复至前一状态。对于复杂的操作,如表格的复制与粘贴,系统的处理逻辑则更为精细,能够跳过不需要记录在历史记录中的状态,确保撤销操作的精准性。
slate.js 的状态模型主要基于树状的文档结构,通过三种类型的操作指令来管理文档状态:针对节点的修改、光标位置的调整以及文本内容的变更。对节点与文本的修改,可通过特定指令来实现,而光标操作则通常直接修改数据。借助这九种基本操作,富文本内容的任何变化都能被准确地记录与恢复。
在实现撤销功能时,关键在于如何根据操作指令中的信息推导出相应的撤销操作。例如,撤销对节点的修改操作,只需对记录的操作进行逆向操作即可。相比之下,重做功能则相对简单,只需在撤销操作时记录下指令,以便在后续操作中恢复。
操作的记录以数组形式进行,便于后续的撤销与重做操作。通过合理的指令与数据模型设计,复杂的操作最终被拆解为简单且可逆的原子操作,确保了功能的高效与稳定。
总结而言,通过精心设计的指令与数据模型,撤销与重做功能得以实现,使应用在面对用户操作时能够灵活应对,提供无缝的用户体验。此外,本文还附带了一个招聘信息,百度如流团队正面向北京、上海、深圳等地招聘,欢迎有志之士加入。
参考资料包括:Web 应用的撤销重做实现、slatejs。
记事本怎么造句
1、 父母要准备一个记事本,记录和孩子在一起发生的事情,或者发现的问题产生的困惑。经常记录的过程,其实就是一个简单的反省自己的过程。
2、 岁月无痕,总是记录下随时随地的感想,新的一本记事本,我把它命名为惜的碎碎念。飘雨的日子里,静静感悟雨中的情怀,把孤单留给岁月,把简单留给自己。
3、 岁月的记事本,记下了生命的轨迹;时光的幻灯片,曼妙了幸福的色彩;友情的常青树,茁壮了人生的根基;情谊的葡萄酒,酝酿了生活的芬芳。朋友,无论时世怎么改变,都愿你一切安好,天天开心,周末快乐!
4、 岁月的记事本,记下了生命的轨迹;时光的幻灯片,曼妙了幸福的色彩;友情的常青树,茁壮了人生的根基;情谊的葡萄酒,酝酿了生活的芬芳。朋友,无论时世怎么改变,都愿你一切安好,。
5、 这本相貌平平的记事本上,也记下了她从纽约公立图书馆里抄下来的吉他和弦谱表。
6、 更胜一筹的做法是把记事本录成音,那样咱们没去外国国家国家疑题听一听来加深印相和减轻记忆负担。
7、 巴贝奇的许多记事本和草稿本如今被收藏在科学博物馆的档案馆中,只是至今都没有完全对外开放。
8、 在我的应用心理学课上,有几百名学生每个人都带着个记事本,很多人的记事本上所记录的似乎都是详细的训练日程安排。
9、 在我五岁圣诞节时,她给了我一个红色的绒布封面的记事本,我穿着我像花朵一样的睡裙翻开空白的页面,感到困惑。
、 一般较厚和经常翻阅的书籍,譬如各种工具书,记事本多用此法装订.
、 以下的是来自我们的记事本但没有在这杂志中出现的一些边料,有部分是因为它们对于那些没那么忠诚的实况玩家来说太核心了,有部分是因为我们的位置已经不够用了。
、 用途:杂志,书籍,广告传单,记事本,信纸,信封,便条纸,涂布原纸,NCR原纸。
、 准备书面报告,记事本,考勤,钥匙管理,事故等.
、 闹钟,关机闹钟,日历,计算器,日程表,记事本,备忘录,语音备忘录,世界时钟,货币换算,单位换算,定时器,秒表。
、 我们使用记事本作必要的修改,以便顺利完成跨平台的编档工作。
、 它会自动读取剪切板的文本,然后你就可以像在记事本中那样编辑。
、 记事本和笔能让客人有地方做计划,记下定餐地点和留宿时的日记。
、 恰恰好点击“记事本”在桌面上的版本并选择“属性”。
、 一名警察手持一本记事本,循例问起小懿。
、 那一沓一沓的记事本还被村里人比作阎王爷的“生死簿薄”。
、 现盛大推出新款高档商务记事本、礼品笔记本、商务记事本,商务通讯录、万用手册等系列皮具办公礼品。
、 好奇的她将记事本内容发上天涯网重庆论坛。
、 这本记事本还证实,所以取名为“霁虹桥”,是当时的哈尔滨工业大学校长刘哲老先生取义于《藤王阁序》中“虹销雨霁”句意。
、 想你,以我真心作序;念你,用我真意开篇;恋你,把我真情挥洒;吻你,送我火热情怀;疼你,在字里行间;爱你,写出完美结局。在这个.4,收下我情真意切的记事本,在今生今世,守住。
、 送你“开心记录笔”,愿你“记”牢,多描绘快乐;送你“平安记事本”,愿你“记”牢,多存储祥瑞;送你“幸福纪念册”,愿你“记”牢,多念叨美好。“记者节”,愿你记着快乐,忘记。
、 内有语音电子钟;PWM程序等五个c语言编写的源代码;为单片机原程序,也可用记事本等打开。
、 有人在梦中轻轻地对他说了句话:遥远的奥特伊,我忧伤时迷人的街区,他把这句话写在记事本上,因为他清楚地知道,有些话你会在梦中听到,使你印象深刻,决定要铭记在心,但在醒来时却不会想起,或者会觉得毫无意义。帕特里克·莫迪亚诺
、 有空起来动动吧!黑客是怎么炼成的:电脑也有性别之分,测试下你的电脑是男是女:点“记事本”新建一个记事本文件。
、
、 他还有一个记事本,用来追记他数目繁多,不胜记忆的社会保险账号和巨大的银行存款。