小编teo*_*eok的帖子

避免内部吸气/安装者

在Activity.java的源代码中,我看到了一些方法:

public View findViewById(int id) {
    return getWindow().findViewById(id);
}
Run Code Online (Sandbox Code Playgroud)

和getWindow方法的定义:

public Window getWindow() {
    return mWindow;
}
Run Code Online (Sandbox Code Playgroud)

但是按照以下规则:

避免内部吸气/安装者

在像C++这样的本地语言中,通常的做法是使用getter(例如i = getCount())而不是直接访问字段(i = mCount).这是C++的一个很好的习惯,因为编译器通常可以内联访问,如果您需要限制或调试字段访问,您可以随时添加代码.

在Android上,这是一个坏主意.虚拟方法调用比实例字段查找要昂贵得多.遵循常见的面向对象编程实践并在公共接口中使用getter和setter是合理的,但在类中,您应该始终直接访问字段.

没有JIT,直接字段访问速度比调用一个简单的getter快约3倍.使用JIT(直接字段访问与访问本地一样便宜),直接字段访问比调用一个简单的getter快约7倍.在Froyo中也是如此,但是当JIT内联getter方法时,将来会有所改进.

所以我想知道为什么android开发人员不能直接访问这个mWindow对象?如果当前Android版本的JIT无法内联访问,则getWindow().findViewById(id)将比mWindow.findViewById(id)花费更多时间,而findViewById是一种相当常用的方法.

mobile android

7
推荐指数
1
解决办法
1664
查看次数

"int j =(strlen)(str)"是什么意思?

我发现下面的代码从bstrlib,在bstrlib.c(例如,线193):

bstring bfromcstr (const char * str) {
    bstring b;
    int i;
    size_t j;

    if (str == NULL) return NULL;
    j = (strlen) (str);
    i = snapUpSize ((int) (j + (2 - (j != 0))));
    if (i <= (int) j) return NULL;

    b = (bstring) bstr__alloc (sizeof (struct tagbstring));
    if (NULL == b) return NULL;
    b->slen = (int) j;
    if (NULL == (b->data = (unsigned char *) bstr__alloc (b->mlen = i))) {
        bstr__free (b);
        return NULL; …
Run Code Online (Sandbox Code Playgroud)

c string

3
推荐指数
1
解决办法
572
查看次数

标签 统计

android ×1

c ×1

mobile ×1

string ×1