.NET有一个名为的函数GC.KeepAlive(Object).其唯一目的是确保引用对象的生命周期持续到代码流到达调用.
除非有人与本机代码进行互操作,否则通常不需要这样做.
我有一种情况,我有一个通过JNI访问的C++对象的图形,其中某些根对象需要保持活动以保持孩子们活着.根对象和子对象都在JVM域中具有镜像.但是,如果在C++端(通过SWIG生成的终结器)收集和释放根对象,则子对象将变为无效,因为它们的C++后备对象将被释放.
这可以通过确保根对象图的局部变量的生命周期超过上次使用子对象来解决.所以我需要一个惯用的函数,它不会对对象做任何事情,但不会被优化掉或移动(例如从循环中提升).这就是GC.KeepAlive(Object).NET中的功能.
Java中的近似等价物是什么?
PS:一些可能的说明性代码:
class Parent {
long ptr;
void finalize() { free(ptr); }
Child getChild() { return new Child(expensive_operation(ptr)); }
}
class Child {
long ptr;
void doStuff() { do_stuff(ptr); }
}
// BAD CODE with potential for SIGSEGV
for (Parent p : getParents()) {
p.getChild().doStuff();
}
Run Code Online (Sandbox Code Playgroud)
麻烦的是,在doStuff执行时,GC释放Parent p将释放为Child分配的内存.已经观察到GC在实践中这样做.GC.KeepAlive可用的潜在修复:
// BAD CODE with potential for SIGSEGV
for (Parent p : getParents()) {
p.getChild().doStuff();
GC.KeepAlive(p);
}
Run Code Online (Sandbox Code Playgroud)
我可以例如调用toStringp,但我不会对其输出做任何事情.我可以暂时将p戳到一个数组中,但我怎么知道JVM不会丢弃商店?等等.
.net java java-native-interface garbage-collection finalizer
关于Steve Yegge关于服务器端Javascript的帖子的评论开始讨论类型系统在语言中的优点,这篇评论描述了:
......来自HM风格系统的例子,你可以得到这样的东西:
Run Code Online (Sandbox Code Playgroud)expected signature Int*Int->Int but got Int*Int->Int
你能给出一个函数定义(或两个?)和一个会产生错误的函数调用的例子吗?看起来在大型程序中调试可能相当困难.
另外,我可能在米兰达看到过类似的错误吗?(我15年没用过了,所以我对它的记忆含糊不清)
我为TDataSet编写了Delphi调试可视化工具,以显示当前行的值,源代码+截图:http://delphi.netcode.cz/text/tdataset-debug-visualizer.aspx.工作得很好,但很慢.我做了一些优化(如何获得字段名),但仍然只有20个字段需要10秒才能显示 - 非常糟糕.
主要问题似乎是缓慢IOTAThread90.Evaluate使用如下所示的主代码,这个程序花费大部分时间,与**约80%的时间一致.FExpression是代码中TDataset的名称.
procedure TDataSetViewerFrame.mFillData;
var
iCount: Integer;
I: Integer;
// sw: TStopwatch;
s: string;
begin
// sw := TStopwatch.StartNew;
iCount := StrToIntDef(Evaluate(FExpression+'.Fields.Count'), 0);
for I := 0 to iCount - 1 do
begin
s:= s + Format('%s.Fields[%d].FieldName+'',''+', [FExpression, I]);
// FFields.Add(Evaluate(Format('%s.Fields[%d].FieldName', [FExpression, I])));
FValues.Add(Evaluate(Format('%s.Fields[%d].Value', [FExpression, I]))); //**
end;
if s<> '' then
Delete(s, length(s)-4, 5);
s := Evaluate(s);
s:= Copy(s, 2, Length(s) -2);
FFields.CommaText := s;
{ sw.Stop;
s := sw.Elapsed;
Application.MessageBox(Pchar(s), '');}
end; …Run Code Online (Sandbox Code Playgroud) 我是emacs的新手,它的缩进让我不知所措.它对自己的好处太聪明了; 它(错误地)认为它知道我想如何格式化我的源代码,但是我没有时间为我编写代码的每种不同语言追逐每种模式的每个设置; 其中许多语言根本没有启用任何模式.
这是我想要的行为:
setqs 组成.这将使我在所有语言中获得逻辑和一致的行为.它会把代码格式化的工作留给我,但是没关系,我已经这样做了20年了,而且我知道如何制作其他宏来使它变得高效.更重要的是,它使我免于摆弄配置设置,试图让自动行为符合我的喜好.我的宏可以依赖于一致的行为,因此它们可以在所有模式下正常工作.
以上可能吗?当然其他人以前做过这个吗?那里有一些小模式吗?
我的猜测是类变量("class var")在存储中是真正的全局变量(即整个应用程序的一个实例).
但我想知道是否是这种情况,或者它们是否是存储中的线程(例如类似于"threadvar") - 每个线程一次实例.
谁知道?
编辑:将"范围"更改为"存储",因为这实际上是正确的术语,以及我所追求的(感谢Barry)
旧版本的Visual Basic中使用的OLE变体,在COM自动化中普遍存在,可以存储许多不同的类型:基本类型,如整数和浮点数,更复杂的类型,如字符串和数组,以及一直到IDispatch实现和指针形式的ByRef变种.
变量也是弱类型的:它们将值转换为另一种类型,而不会发出警告,具体取决于您应用的运算符以及传递给运算符的值的当前类型.例如,比较两个变体,一个包含整数1,另一个包含字符串"1",为了相等将返回True.
因此,假设我正在使用基础数据级别的变体(例如,VARIANT在C++或TVarDataDelphi中 - 即不同可能值的大联合),我应该如何一致地散列变体以使它们遵守正确的规则?
规则:
如果我必须使用不同的排序和直接比较规则以使哈希适合,那就没关系.
我正在工作的方式是我将变量规范化为字符串(如果它们适合),并将它们视为字符串,否则我正在使用变量数据,就像它是一个不透明的blob,并散列和比较它原始字节.当然,这有一些局限性:数字1..10排序[1, 10, 2, ... 9]等等.这有点令人讨厌,但它是一致的,而且工作很少.但是,我想知道这个问题是否有一个公认的做法.
AFAIK在标准Java库中没有有效的方法来解析子字符串中的整数而不实际新建包含子字符串的新字符串.
我正处于从字符串中解析数百万个整数的情况,我并不特别想为每个子字符串创建新的字符串.复制是我不需要的开销.
给定一个字符串s,我想要一个像这样的方法:
parseInteger(s, startOffset, endOffset)
Run Code Online (Sandbox Code Playgroud)
语义如下:
Integer.parseInt(s.substring(startOffset, endOffset))
Run Code Online (Sandbox Code Playgroud)
现在,我知道我可以像这样合理地写这个:
public static int parse(String s, int start, int end) {
long result = 0;
boolean foundMinus = false;
while (start < end) {
char ch = s.charAt(start);
if (ch == ' ')
/* ok */;
else if (ch == '-') {
if (foundMinus)
throw new NumberFormatException();
foundMinus = true;
} else if (ch < '0' || ch > '9')
throw new NumberFormatException();
else
break;
++start;
}
if (start == end) …Run Code Online (Sandbox Code Playgroud) 我已经尝试linum过并且nlinum. 两者对于超过 100k 行的文件的性能都很糟糕。
$ for x in {1.100000}; do echo $x; done > 100k.txt
$ emacs -q 100k.txt
M-x load-library linum
M-x linum-mode
M-> ;; it's not too bad to go to end of file
M-< ;; now this completely locks up emacs
Run Code Online (Sandbox Code Playgroud)
与编辑器相同的操作joe是瞬时的。
除了关闭大文件的行号(正是您想要使用行号导航的文件类型 - 我想在串联的 Javascript 文件中查找错误行)之外,还有其他解决方案吗?
或者只是使用不同的编辑器?
我想转换一组文件,但不覆盖现有文件。如何使用 mogrify 指定最终文件格式?例如firstpic.png -> firstpic-thumbnail.png、secondpic.png -> secondpic-thumbnail.png等。
gm mogrify -size 150x150 *.png -resize 150x150 +profile "*" "%f-thumbnail.png"
有没有办法做到这一点?
我正在尝试在 Rust 中实现延迟构造/记忆评估/缓存习语。
有一个外部类型,它有一堆数据和一个访问器方法。访问器方法需要返回缓存的计算(如果有)或计算它并将返回值存储在映射中以备后用。缓存值不需要引用外部值,所以不存在循环引用问题;但它确实需要访问外部值的数据才能构建自己。
这是一个完整的例子,它没有通过 Rust 的借用检查器:
use std::collections::HashMap;
pub struct ContainedThing {
count: usize,
}
impl ContainedThing {
fn create(thing: &Thing) -> ContainedThing {
// create uses an arbitrary number of attributes from Thing
// it doesn't keep any references after returning though
let count = thing.map.len();
ContainedThing { count: count }
}
}
struct Thing {
map: HashMap<i32, ContainedThing>,
}
impl Thing {
pub fn get(&mut self, key: i32) -> &ContainedThing {
self.map
.entry(key)
.or_insert_with(|| ContainedThing::create(&self))
}
} …Run Code Online (Sandbox Code Playgroud) delphi ×3
emacs ×2
java ×2
.net ×1
auto-indent ×1
c++ ×1
com ×1
debugging ×1
elisp ×1
finalizer ×1
hashmap ×1
haskell ×1
indentation ×1
int ×1
line-numbers ×1
ml ×1
parsing ×1
performance ×1
rust ×1
string ×1
toolsapi ×1
type-theory ×1
variant ×1
winapi ×1