gpt4 book ai didi

objective-c - 将相同的枚举成员装箱传递给方法时会产生更大的整数

转载 作者:太空狗 更新时间:2023-10-30 03:37:49 24 4
gpt4 key购买 nike

我正在使用 Clang 的原始装箱功能将枚举成员打包到 NSNumber

Boxed Enums section关于此的 Clang 文档的一部分说编译器将枚举成员装箱为整数,除非指定了类型。

有趣的是,根据我将枚举成员传递给方法的方式,我得到了不同大小的整数。我已经能够将案例隔离为以下代码

typedef enum _MyEnum {
MyEnumMember1 = 1000
} MyEnum;

- (void)testEnumerationBoxing
{
NSNumber *numberA = [self testA];
NSNumber *numberB = [self testB:MyEnumMember1];

CFNumberType numberTypeA = CFNumberGetType((__bridge CFNumberRef) numberA);
CFNumberType numberTypeB = CFNumberGetType((__bridge CFNumberRef) numberB);
NSLog(@"CF Number type for A: %lu; B: %lu", numberTypeA, numberTypeB);
}

- (NSNumber *)testA
{
return @(MyEnumMember1);
}

- (NSNumber *)testB:(MyEnum)enumMember
{
return @(enumMember);
}

控制台输出为

CF Number type for A: 3; B: 4

(第一个是kCFNumberSInt32Type,第二个是kCFNumberSInt64Type)

如果我将声明更改为 typedef enum _MyEnum : int,我会看到两者的结果相同:kCFNumberSInt32Type

为什么两种装箱方式的整数大小不同?

最佳答案

我认为您提供的链接中描述了这种情况:

Boxing a value of enum type will result in a NSNumber pointer with a creation method according to the underlying type of the enum, which can be a fixed underlying type or a compiler-defined integer type capable of representing the values of all the members of the enumeration:

typedef enum : unsigned char { Red, Green, Blue } Color;
Color col => Red;
NSNumber *nsCol = @(col); // => [NSNumber numberWithUnsignedChar:]

但图书馆促销的细节没有涉及,这就是引入预期差异的地方。

-testA 结束调用 +[NSNumber numberWithInt:]

-testB 结束调用 +[NSNumber numberWithUnsignedInt:]

所以您看到的抽象“提升”是因为 CFNumber(因此 NSNumber)此时实际上不支持无符号值(参见 CFNumberType 的常量 枚举)——根据您看到的输出,然后假设 NSNumber 实现只是提升到下一个能够表示构造函数的无符号初始值设定项的所有值的有符号类型-- 显然没有测试该值以查看是否可以应用任何“宽度最小化”。

当然,NSNumber 声明了将无符号类型作为参数的构造函数和初始化器,但无符号整数的内部表示实际上存储为有符号整数表示。

在将装箱文字提升为 NSNumber 时,编译器似乎会调用适当/准确的便捷构造函数。例如,uint16_t 类型的枚举将存储为 32 位 int(通过 numberWithUnsignedShort:),而 int32_t 也是 32 位 int(通过 numberWithInt: )。虽然,在 -testA 的情况下,该值也是已知的,因此也可以在那里调用更合适的构造函数——因此编译器仅根据类型而不是类型和值进行宽度最小化。当枚举的类型未指定或指定为无符号类型时,您可能会看到这样的提升。

关于objective-c - 将相同的枚举成员装箱传递给方法时会产生更大的整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12071200/

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