2014-04-09 33 views
6

在處理矢量類型和ObjC運行時時,我遇到了一個非常令人困惑的問題。據我所知,clang或GCC都不會給出任何SIMD向量類型的'正確'類型編碼。爲什麼不能正確地使用gcc或clang @encode SIMD矢量類型?

#import <Foundation/Foundation.h> 

int main() { 
    typedef int int4 __attribute__((vector_size(16))); 
    typedef float float4 __attribute__((vector_size(16))); 

    NSLog(@"Int4: %s", @encode(int4)); 
    NSLog(@"Float4: %s", @encode(float4)); 
} 

當編譯&運行有兩種GCC或鏗鏘,我得到下面的輸出:

 
2014-04-09 06:21:01.102 test[1707:507] Int4: 
2014-04-09 06:21:01.103 test[1707:507] Float4: 

而不是我所期望的,這將是這樣的:

 
2014-04-09 06:21:01.102 test[1707:507] Int4: ![16,16i] 
2014-04-09 06:21:01.103 test[1707:507] Float4: ![16,16f] 

根據文件here

矢量       「![」隨後vector_size後跟逗號(構成矢量的字節數),然後將所述載體的對準(以字節爲單位),接着隨後的元件的類型「]」

這成爲當試圖從ObjC方法返回這些類型,而不是越來越像![16,16i]@:什麼邏輯以下方法進行編碼的問題:

-(int4) foo; 

我只得到字符串@:,這導致NSMethodSignatureNSInvocation基本上都是他們的褲子和段錯誤。

是否有一些編譯器選項可以啓用恢復矢量類型的正確編碼?或者這裏唯一的解決方案是「不從ObjC方法返回矢量」?

注:返回(或通過)的指針向量沒有幫助或者,作爲編碼爲一個指針到矢量是簡單地^,其然後在列表中的下一個參數貪婪地-相匹配,導致我的論點數再次下降。我想我可以將矢量投射到一個void *,但那在那點真的是一個醜陋的黑客。

回答

相關問題