【发布时间】:2013-03-29 20:40:41
【问题描述】:
我的问题最好举个例子。
public static boolean DEBUG = false;
public void debugLog(String tag, String message) {
if (DEBUG)
Log.d(tag, message);
}
public void randomMethod() {
debugLog("tag string", "message string"); //Example A
debugLog("tag string", Integer.toString(1));//Example B
debugLog("tag string", generateString());//Example C
}
public String generateString() {
return "this string";
}
我的问题是,在任何示例中,A、B 或 C - 因为字符串最终不会被使用,优化器会删除它吗?
或者换个方式问,是不是最好做如下,从而保证不会创建字符串对象?
public void randomMethod() {
if (DEBUG) debugLog("tag string", "message string"); //Example A
if (DEBUG) debugLog("tag string", Integer.toString(1));//Example B
if (DEBUG) debugLog("tag string", generateString());//Example C
}
【问题讨论】:
-
优化器(如果写对了)应该删除它们。
-
实际上,A 和 C 中的字符串是字面量,因此是 intern 的,因此无论哪种方式都不会创建字符串。但这对问题无关紧要,我明白你的意思。
-
@JesusRamos 编译器作者希望与您合作,关于正确性和实用性
-
@JesusRamos 在情况 C 中呢?撇开这个问题不谈,您是否可能依赖于被调用函数中发生的某些处理?
-
@delnan 好吧,如果分支变成 if (0),则字符串的实习将毫无意义(尽管仍然必须创建解析树,因此如果实习可能需要更多的工作来清理是否在解析期间完成)。当然,代码仍然必须被解析以确保正确性,并且就实用性而言,它可能取决于它。现在这并不意味着字符串应该包含在最终的二进制文件中(可能在一些中间编译单元中)。
标签: java android logging compiler-optimization