我正在研究一个性能关键的动态链接库(DLL),它也应该具有相对较小的二进制大小.由于它没有显式抛出任何异常,我想完全禁用异常支持.但是,有一个例外(双关语无意):当内存不足(OOM)时,我必须向应用程序报告错误代码,以便它有机会正常处理事情.代码库太大,无法单独检查每个分配并传播错误,并包含我不应该触及的外部代码.所以我想在DLL的导出函数中捕获OOM异常.
快速测试表明,在Visual C++ 2010中禁用C++异常时(即没有/ EHa,/ EHsc或/ EHs标志),在分配太多内存时,它仍会跳转到catch(std :: bad_alloc&)块.
所以它似乎按预期工作.但是,我收到以下1级警告:"C4530:使用了C++异常处理程序,但未启用展开语义.指定/ EHsc".MSDN说"在帧中自动存储的对象,在执行throw的函数和捕获throw的函数之间,不会被破坏".
究竟我会在这里失去什么?只要通过库创建的任何内容都可以删除,并且应用程序可以重新开始(如果它选择的话),可以将事物保留在未定义状态.是否存在无法恢复的内存泄漏风险?
DLL是否使用单独的内存池?如果是这样,我可以清除它而不需要应用程序卸载DLL吗?我可以轻松地让我的库忽略任何进一步(导出)函数调用,直到应用程序执行重新初始化.
谢谢你的建议.
我对编写命令行shell脚本源代码非常感兴趣,这些源代码是用更健壮,性能更好且独立于平台的编译语言(例如OCaml)编写的代码编写的.基本上,您可以使用编译语言编程来执行与您想要的操作系统的任何交互(我建议:更复杂的交互或以平台无关的方式不容易做到的交互),最后您将编译它到本机二进制可执行文件(最好),它会生成一个shell脚本,在shell中生成你在编译语言中编写的内容.[ 补充 ]:使用'效果',我的意思是设置环境变量和shell选项,执行某些非标准命令(标准脚本'glue'将由编译的可执行文件处理,并将保留在生成的shell脚本之外)等等.
到目前为止我还没有找到任何此类解决方案.与今天的其他可能性相比,实现它似乎相对容易*,比如将OCaml编译为JavaScript.
我不是故意的
实际应用
你们中的一些人可能怀疑我所描述的实际用途.这样做的一个实际应用是根据各种条件定义一个shell配置文件(例如,配置文件来源的系统平台/操作系统,安全策略后面的内容,具体shell,登录/非登录类型shell,交互/非交互式shell).作为shell脚本的(精心设计的)通用shell配置文件的优势在于性能的提高(可能生成压缩/优化的源代码而不是人工编写的脚本解释的本机机器代码),健壮性(类型检查,异常处理) ,编译功能的时间验证,生成的二进制可执行文件的加密签名),功能(更少或不依赖于用户域CLI工具,不限制使用所有可能平台的CLI工具所涵盖的最低功能)和跨平台功能(在像单一UNIX规范这样的实践标准只是意味着很多,而且很多shell配置文件概念都会转移到非Windows平台,如同PowerShell一样.
实施细节,附带问题
感谢您的进一步想法,特别是对于具体的建议!
使用pickle函数是将整数写入文本文件的最快且最强大的方法吗?
这是我到目前为止的语法:
import pickle
pickle.dump(obj, file)
Run Code Online (Sandbox Code Playgroud)
如果有更强大的替代方案,请随时告诉我.
我的用例是写一个用户输入:
n=int(input("Enter a number: "))
Run Code Online (Sandbox Code Playgroud)
我正在学习Haskell.我选择这种语言的动机之一是编写具有高度鲁棒性的软件,即完全定义的函数,数学上确定的函数,永不崩溃或产生错误.我并不是指由系统的谓词("系统内存不足","计算机着火"等)引起的故障,这些都不是很有趣,并且可能只是使整个过程崩溃.我也不是指由无效声明(pi = 4)引起的错误行为.
相反,我指的是错误状态导致的错误,我希望通过严格的静态类型使这些状态不可表示和不可编译(在某些函数中)来删除.在我看来,我把这些功能称为"纯粹",并认为强类型系统可以让我实现这一目标.但是,Haskell并没有以这种方式定义"纯",并允许程序error在任何上下文中崩溃.
这是完全可以接受的,并不奇怪.然而,令人失望的是,Haskell似乎没有提供某些功能来禁止可能导致分支使用的函数定义error.
这是一个人为的例子,为什么我觉得这令人失望:
module Main where
import Data.Maybe
data Fruit = Apple | Banana | Orange Int | Peach
deriving(Show)
readFruit :: String -> Maybe Fruit
readFruit x =
case x of
"apple" -> Just Apple
"banana" -> Just Banana
"orange" -> Just (Orange 4)
"peach" -> Just Peach
_ -> Nothing
showFruit :: Fruit -> String
showFruit Apple = "An apple"
showFruit Banana = "A Banana"
showFruit (Orange x) …Run Code Online (Sandbox Code Playgroud) 在实现/使用返回或使用对象实例的方法时,检查函数参数的最优雅方法是什么?
致电方法:
someType GetSomething(object x)
{
if (x == null) {
return;
}
//
// Code...
//
}
Run Code Online (Sandbox Code Playgroud)
或更好:
someType GetSomething(object x)
{
if (x == null) {
throw new ArgumentNullException("x");
}
//
// Code...
//
}
Run Code Online (Sandbox Code Playgroud)
通话方式:
void SomeOtherMethod()
{
someType myType = GetSomething(someObject);
if (someType == null) {
return;
}
}
Run Code Online (Sandbox Code Playgroud)
或更好:
void SomeOtherMethod()
{
try {
someType myType = GetSomething(someObject);
} catch (ArgumentNullException) {
}
}
Run Code Online (Sandbox Code Playgroud)
浏览类似问题时,不使用try/catch的原因是性能.但恕我直言,尝试捕获只是看起来更好:).
那么,哪种方式更"优雅"?
在使用异常信号错误的语言中,我想调用一些第三方代码,如果失败,则运行后备代码.例如:
try:
result = third_party.fast_calculation()
catch:
result = slower_calculation()
Run Code Online (Sandbox Code Playgroud)
根据我的经验,很少知道第三方代码可能抛出的所有异常.因此,我不能在catch条款中列出这些例外情况.另一方面,我经常被告知不要catch每一个可能的例外.
catch在这种情况下我该如何写条款?
我正在撰写关于测量产品质量的论文.本案例中的产品是一个网站.我已经确定了几个质量属性和测量技术.
一个质量属性是"健壮性".我想以某种方式向我保证,但我找不到任何有用的信息如何以客观的方式做到这一点.
是否存在可以确保稳健性的静态或动态指标?即,就像单元测试覆盖一样,有没有一种方法可以确保这样的稳健性?如果是这样,是否有任何(免费)工具可以做这样的事情?
有没有人有这种工具的经验?
最后但并非最不重要的是,也许还有其他方法可以确定稳健性,如果您有任何想法,我会全神贯注.
非常感谢提前.
对于Node.Js和Erlang,我都是一个完整的菜鸟.但是不可能构建一个模拟Erlang行为的Node.js应用程序吗?
例如,您将json消息传递到分布式node.js服务器园区,甚至将新代码传递给那些没有脱机的服务器,就像erlang一样.
如果您有一个在收到消息时激活的消息处理程序回调,则此消息处理程序可以检查该消息是否是代码更新消息,从而用新代码替换自身(当前处理程序).
所以应该可以让Node.Js服务器没有停机时间来进行代码更新,而不是太大惊小怪,对吧?
我有一个bash脚本(Scientific Linux).该脚本必须对文件进行操作.假设"file.dat"(大小约1 GB)一段时间后脚本重新启动并执行以下操作:
if [ -f file.dat ]; then
cp file.dat file.previous.dat
fi
Run Code Online (Sandbox Code Playgroud)
备份文件.然后一个进程启动并覆盖"file.dat"
为了最安全的一面(电力关闭或任何意外).什么是最好的选择:cp还是mv?谢谢.
我正在考虑使用Ember.js来开发我的新网站.
我不确定社区对大型项目的稳定性和使用程度.
谢谢,Lior