gpt4 book ai didi

objective-c - 为什么这个 block 不是全局的?

转载 作者:搜寻专家 更新时间:2023-10-30 19:47:47 25 4
gpt4 key购买 nike

考虑以下代码:

#include <stdio.h>

typedef void (^block)();

block foo() {
char a = 'a';
return [^{
printf("%c\n", a);
} copy];
}

block bar() {
const char a = 'a';
return [^{
printf("%c\n", a);
} copy];
}

这是为 armv7 编译的结果:

_foo:
@ BB#0:
push {r7, lr}
mov r7, sp
sub sp, #24
movw r3, :lower16:(L__NSConcreteStackBlock$non_lazy_ptr-(LPC0_0+4))
movt r3, :upper16:(L__NSConcreteStackBlock$non_lazy_ptr-(LPC0_0+4))
movw r1, :lower16:(___foo_block_invoke_0-(LPC0_1+4))
LPC0_0:
add r3, pc
movt r1, :upper16:(___foo_block_invoke_0-(LPC0_1+4))
movw r0, :lower16:(L_OBJC_SELECTOR_REFERENCES_-(LPC0_2+4))
LPC0_1:
add r1, pc
movt r0, :upper16:(L_OBJC_SELECTOR_REFERENCES_-(LPC0_2+4))
movw r2, :lower16:(___block_descriptor_tmp-(LPC0_3+4))
ldr r3, [r3]
movt r2, :upper16:(___block_descriptor_tmp-(LPC0_3+4))
str r3, [sp]
mov.w r3, #1073741824
LPC0_2:
add r0, pc
str r3, [sp, #4]
movs r3, #0
LPC0_3:
add r2, pc
str r3, [sp, #8]
str r1, [sp, #12]
ldr r1, [r0]
mov r0, sp
str r2, [sp, #16]
movs r2, #97
strb.w r2, [sp, #20]
blx _objc_msgSend
add sp, #24
pop {r7, pc}

_bar:
@ BB#0:
movw r1, :lower16:(L_OBJC_SELECTOR_REFERENCES_-(LPC2_0+4))
movt r1, :upper16:(L_OBJC_SELECTOR_REFERENCES_-(LPC2_0+4))
movw r0, :lower16:(___block_literal_global-(LPC2_1+4))
LPC2_0:
add r1, pc
movt r0, :upper16:(___block_literal_global-(LPC2_1+4))
LPC2_1:
add r0, pc
ldr r1, [r1]
b.w _objc_msgSend

让我困惑的是第一个 block 不是全局 block 。它是一个堆栈 block ,然后被复制。这对我来说没有意义。为什么编译器不能自动推断 a 实际上可以被认为是 const,这是我在 C 标准中忽略的事情吗?

我正在构建这个启用了 ARC 的 Os,这是我的 clang 版本:

$ clang -v
Apple clang version 4.1 (tags/Apple/clang-421.11.66) (based on LLVM 3.1svn)
Target: x86_64-apple-darwin12.4.0
Thread model: posix

最佳答案

声明 char a 需要存储,这意味着 foo 中的 block 需要它自己的变量 a,它被初始化为 <fooa 的 em>值。 block 的变量存储在它的“环境”中。

const char a 声明不要求 分配存储空间,除非采用a 的地址(根据C 语言规范) .对 a 值的任何使用都可以直接替换为它的常量值。这意味着 bar 可以在没有任何环境的情况下编译。

因此这两个 block 的编译方式不同。

理论上,如果语言规范不允许,编译器可能能够检查变量的声明和使用,确定它不是外部可见的,确定它的值在初始赋值后永远不会改变,并且它的地址永远不会被采用,然后用一个常量值替换变量......但这是一个可能很小的(如果有的话)返回的大量分析。

关于objective-c - 为什么这个 block 不是全局的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17957319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com