gpt4 book ai didi

c++ - 是否有可能直接将 C++ 与 Metal API 一起使用

转载 作者:IT王子 更新时间:2023-10-29 05:42:41 32 4
gpt4 key购买 nike

由于 Metal Language 也是基于 C++11,而 C++ 似乎是一种经过验证的性能语言的完美选择,我希望完全绕过 Objective-C/Swift。我很想留在 C++ 领域。有可能吗?

最佳答案

技术上是的,但它会非常丑陋并且可能会破坏其他一些 Objective-C 部分。

Objective-C 和 C++ 一样,一开始就是预处理器。其中一个遗留问题是每个 Objective-C 方法也被公开为一个 C 函数调用,它分别将对象实例和方法选择器作为前两个参数,然后是其他声明的参数,从左到右的顺序。

NSObject 和构成 Objective-C 运行时的 C 调用都可以查找当前为任何方法调用调用的 C 函数。

因此,您可以创建一个 C++ 类来获取所有 C 函数指针(它甚至可以从 C 运行时执行此操作,使其成为纯 C++ 代码而不是 Objective-C++)并直接跳转到适当的代码。

缺点是:Objective-C 通常使用动态调度(即在每次调用时将方法解析为 C 函数)并且像键值观察这样的机制仅因为它使用动态调度才起作用。如果您在其他人开始观察之前获取 C 函数指针,那么您的调用将在不通知观察者的情况下更新属性。因此,您可能会破坏某些模块。

发出该警告,并假设您可以将 C++ 桥接类构建为 Objective-C++ 以获得更简单的语法,例如

class MTLArray {
id m_instance;
static NSUInteger (* s_arrayLength)(id object, SEL selector);
};

MTLArray::MTLArray() {
// assuming you use the m_ pattern for instance variables
m_instance = [MTLArray new];

// assuming you use s_ for static variables; also pretending
// the mapping from method to C function will never change —
// KVO is the most prominent exception but otherwise you can
// be exceedingly confident, albeit you'll be relying on
// empirical behaviour, not the formal contract
if(!s_arrayLength) {
s_arrayLength = [MTLArray instanceMethodForSelector:@selector(arrayLength)];
}
}

NSUInteger MTLArray::getArrayLength() {
return s_arrayLength(m_instance, @selector(arrayLength));
}

...我很方便地拒绝转换 +instanceMethodForSelector: 的结果到适当的类型,因为我相信我会弄错的。我倾向于退缩并在我的实际代码中引入中间 typedef,但您可能更喜欢更简洁。

关于c++ - 是否有可能直接将 C++ 与 Metal API 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27988652/

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