使用多个 DLL 和 QT 的 C++ 程序应该配备 malloc 替代品(如 tcmalloc ),以解决可以验证是由 Windows malloc 引起的性能问题。对于 linux,没有问题,但对于 windows,有几种方法,我发现它们都不吸引人:
<强>1。将新的 malloc 放入 lib 并确保首先链接它 (Other SO-question)
这有缺点,例如 strdup will still use the old malloc and a free may crash the program .
<强>2。使用 lib.exe (Chrome) 从静态 libcrt 库中删除 malloc
这是为 chrome/chromium 测试/使用(?)的,但它的缺点是它只适用于静态链接 crt。如果一个系统库针对 msvcrt 动态链接,则静态链接会出现问题 mismatches in the heap allocation/deallocation .如果我理解正确,tcmalloc 可以动态链接,这样所有自编译的 dll 都有一个公共(public)堆(这很好)。
<强>3。补丁crt源码(firefox)
Firefox's jemalloc显然修补了 windows CRT 源代码并构建了一个新的 crt。这又出现了上面的静态/动态链接问题。
有人可能会想到使用它来生成动态 MSVCRT,但我认为这是不可能的,因为许可证禁止提供具有相同名称的修补 MSVCRT。
<强>4。在运行时动态修补加载的 CRT
一些商业内存分配器可以做这样的魔术。 tcmalloc 也可以,但这看起来很丑陋。它有一些问题,但它们已得到修复。目前,对于 tcmalloc,它不能在 64 位 Windows 下工作。
有更好的方法吗?有什么意见吗?
强>强>强>强>最佳答案
问:跨多个 dll 拆分的 C++ 程序应该:
A) 替换 malloc?
B) 确保分配和取消分配发生在同一个 dll 模块中?
A:正确答案是 B。一个包含多个 DLL 的 C++ 应用程序设计应该确保存在一种机制,以确保在一个 dll 中堆上分配的东西被同一个 dll 模块释放。
为什么要将一个 C++ 程序分成几个 dll?通过 c++ 程序,我的意思是您正在处理的对象和类型是 c++ 模板、STL 对象、类等。如果没有大量非常仔细的设计和大量编译器特定的魔法,您不能将 c++ 对象传递给 dll 边界,或者遭受痛苦来自各种 dll 中目标代码的大量重复,结果是一个对版本极其敏感的应用程序。对类定义的任何微小更改都将强制重建所有 exe 和 dll,从而至少消除 dll 方法在应用程序开发中的主要优势之一。
要么坚持应用程序和 dll 之间的直接 C 接口(interface),受苦,要么将整个 C++ 应用程序编译为一个 exe。
关于Windows malloc 替换(例如,tcmalloc)和动态 crt 链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/858592/
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.
我正在尝试用Prawn生成PDF。在我的PDF模板中,我有带单元格的表格。在其中一个单元格中,我有一个电子邮件地址:cell_email=pdf.make_cell(:content=>booking.user_email,:border_width=>0)我想让电子邮件链接到“mailto”链接。我知道我可以这样链接:pdf.formatted_text([{:text=>booking.user_email,:link=>"mailto:#{booking.user_email}"}])但是将这两行组合起来(将格式化文本作为内容)不起作用:cell_email=pdf.make_c
两个gsub产生不同的结果。谁能解释一下为什么?代码也可在https://gist.github.com/franklsf95/6c0f8938f28706b5644d获得.ver=9999str="\tCFBundleDevelopmentRegion\n\ten\n\tCFBundleVersion\n\t0.1.190\n\tAppID\n\t000000000000000"putsstr.gsub/(CFBundleVersion\n\t.*\.).*()/,"#{$1}#{ver}#{$2}"puts'--------'putsstr.gsub/(CFBundleVersio
有没有办法在Ruby中动态创建数组?例如,假设我想遍历用户输入的书籍数组:books=gets.chomp用户输入:"TheGreatGatsby,CrimeandPunishment,Dracula,Fahrenheit451,PrideandPrejudice,SenseandSensibility,Slaughterhouse-Five,TheAdventuresofHuckleberryFinn"我把它变成一个数组:books_array=books.split(",")现在,对于用户输入的每一本书,我想用Ruby创建一个数组。伪代码来做到这一点:x=0books_array.
假设我在Store的模型中有这个非常简单的方法:defgeocode_addressloc=Store.geocode(address)self.lat=loc.latself.lng=loc.lngend如果我想编写一些不受地理编码服务影响的测试脚本,这些脚本可能已关闭、有限制或取决于我的互联网连接,我该如何模拟地理编码服务?如果我可以将地理编码对象传递到该方法中,那将很容易,但我不知道在这种情况下该怎么做。谢谢!特里斯坦 最佳答案 使用内置模拟和stub的rspecs,你可以做这样的事情:setupdo@subject=MyCl
我有很多这样的文档:foo_1foo_2foo_3bar_1foo_4...我想通过获取foo_[X]的所有实例并将它们中的每一个替换为foo_[X+1]来转换它们。在这个例子中:foo_2foo_3foo_4bar_1foo_5...我可以用gsub和一个block来做到这一点吗?如果不是,最干净的方法是什么?我真的在寻找一个优雅的解决方案,因为我总是可以暴力破解它,但我觉得有一些正则表达式技巧值得学习。 最佳答案 我(完全)不懂Ruby,但类似这样的东西应该可以工作:"foo_1foo_2".gsub(/(foo_)(\d+)/
我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO