2505C++,32位轉64位

原文
假設有個想要將一個32位值傳遞給一個帶64位值的函數的函數.你不關心高32位的內容,因為該值是傳遞給回調函數的直通值,回調函數會把它截斷為32位值.

因此,你都擔心編譯器一般生成的將32位值擴展到64位值的那條指令的性能影響.
我懷疑這條指令不是程序中的性能瓶頸.

我想出的是說:可不執行任何指令32位值生成64位值"的gcc/clang內聯匯編.

int64_t int32_to_64_garbage(int32_t i32)
{int64_t i64;__asm__("" ://閑著"=r"(i64) ://在`寄存器`中生成結果"0"(i32));//從此最后的輸入return i64;
}

__asm__內聯指令第一個參數是要生成的代碼.傳遞一個空串,所以實際上未生成任何代碼!想要的所有效果都在輸入輸出的聲明中.

接著是只有一個的輸出."=r"(i64)表示內聯匯編會在編譯器選擇的r寄存器中,放入i64覆蓋(=)值,內聯匯編器%0引用的.輸出從0開始編號.
最后,有這里只有一個的輸入."0"(i32)表示輸入應在輸出0數字位置放置.

所有工作都是根據輸入和輸出的約束來完成的.沒有實際的代碼.告訴編譯器,在一個寄存器中放入i32,然后遮住眼睛,睜開時,在同一個寄存器中變成i64!
3級優化中運行gcc,顯示完全省略了該值.

void somewhere(int64_t);
void sample1(int32_t v)
{somewhere(v);
}
void sample2(int32_t v)
{somewhere(int32_to_64_garbage(v));
}

結果是:

    //x86-64
sample1(int):movsx   rdi, edijmp     somewhere(long)
sample2(int):jmp     somewhere(long)//ARM32
sample1(int):asrs    r1, r0, #31b       somewhere(long long)
sample2(int):b       somewhere(long long)//ARM64
sample1(int):sxtw    x0, w0b       somewhere(long)
sample2(int):b       somewhere(long)

第一個版本在調用之前,包含顯式符號擴展指令.第二個版本是直接尾調用,在rdi,寄存器32位中使用任意垃圾.
另一個支持gcc擴展內聯語法的編譯器icc,該技巧似乎也有效.

    //x86-64
sample1(int):movsxd    rdi, edijmp       somewhere(long)
sample2(int):jmp       somewhere(long)

clang``編譯器還支持gcc擴展內聯匯編語法.但是,它不僅會生成轉換,而且還會丟失尾調用.

    //x86-64
sample1(int):movsxd  edi, edijmp     somewhere(long)@PLT
sample2(int):push    raxmov     edi, edicall    somewhere(long)@PLTpop     raxret//ARM32
sample1(int):asr     r1, r0, #31b       somewhere(long long)
sample2(int):push    {r11, lr}sub     sp, sp, #8mov     r1, #0bl      somewhere(long long)add     sp, sp, #8pop     {r11, pc}//ARM64
sample1(int):sxtw    x0, w0b       somewhere(long)
sample2(int):sub     sp, sp, #32stp     x29, x30, [sp, #16]add     x29, sp, #16mov     w0, w0bl      somewhere(long)ldp     x29, x30, [sp, #16]add     sp, sp, #32ret

更新:似乎當前版本的clang(當前時)恢復了尾調用,盡管它仍執行3264正轉換,因此成本基本相同.

    //x86-64
sample1(int):movsxd  edi, edijmp     somewhere(long)@PLT
sample2(int):mov     edi, edijmp     somewhere(long)@PLT//ARM32
sample1(int):asr     r1, r0, #31b       somewhere(long long)
sample2(int):mov     r1, #0b       somewhere(long long)//ARM64
sample1(int):sxtw    x0, w0b       somewhere(long)
sample2(int):mov     w0, w0b       somewhere(long)

VC++``編譯器不支持gcc擴展內聯語法,因此無法檢查.

因為msvc完全不管用,并且對clang沒有任何好處,因此我只會在使用gccicc``編譯時允許此優化,并在其他地方使用額外指令.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/82440.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82440.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/82440.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

光伏電站及時巡檢:守護清潔能源的“生命線”

在“雙碳”目標驅動下,光伏電站作為清潔能源的主力軍,正以年均20%以上的裝機增速重塑全球能源格局。然而,這些遍布荒漠、屋頂的“光伏矩陣”并非一勞永逸的能源提款機,其穩定運行高度依賴精細化的巡檢維護。山東棗莊觸電事故、衢州…

C++初階-list的使用2

目錄 1.std::list::splice的使用 2.std::list::remove和std::list::remove_if的使用 2.1remove_if函數的簡單介紹 基本用法 函數原型 使用函數對象作為謂詞 使用普通函數作為謂詞 注意事項 復雜對象示例 2.2remove與remove_if的簡單使用 3.std::list::unique的使用 …

OpenHarmony平臺驅動使用(一),ADC

OpenHarmony平臺驅動使用(一) ADC 概述 功能簡介 ADC(Analog to Digital Converter),即模擬-數字轉換器,可將模擬信號轉換成對應的數字信號,便于存儲與計算等操作。除電源線和地線之外&#…

CSS【詳解】彈性布局 flex

適用場景 一維(行或列)布局 基本概念 包裹所有被布局元素的父元素為容器 所有被布局的元素為項目 項目的排列方向(垂直/水平)為主軸 與主軸垂直的方向交交叉軸 容器上啟用 flex 布局 將容器的 display 樣式設置為 flex 或 i…

基于MATLAB實現傳統譜減法以及兩種改進的譜減法(增益函數譜減法、多帶譜減法)的語音增強

基于MATLAB實現傳統譜減法以及兩種改進的譜減法(增益函數譜減法、多帶譜減法)的語音增強代碼示例: 傳統譜減法 function enhanced traditional_spectral_subtraction(noisy, fs, wlen, inc, NIS, a, b)% 參數說明:% noisy - 帶…

symbol【ES6】

你一閉眼世界就黑了,你不是主角是什么? 目錄 什么是Symbol??Symbol特點?:創建方法:注意點:不能進行運算:顯示調用toString() --沒有意義隱式轉換boolean 如果屬性名沖突了怎么辦?o…

LeetCode 649. Dota2 參議院 java題解

https://leetcode.cn/problems/dota2-senate/description/ 貪心。不會寫。 class Solution {public String predictPartyVictory(String senate) {boolean rtrue,dtrue;int flag0;//flag>0,d前面有r;flag<0,r前面有dchar[] senatessenate.toCharArray();//每一輪while(r…

機器學習第二十二講:感知機 → 模仿大腦神經元的開關系統

機器學習第二十二講&#xff1a;感知機 → 模仿大腦神經元的開關系統 資料取自《零基礎學機器學習》。 查看總目錄&#xff1a;學習大綱 關于DeepSeek本地部署指南可以看下我之前寫的文章&#xff1a;DeepSeek R1本地與線上滿血版部署&#xff1a;超詳細手把手指南 感知機詳解…

maven快速上手

之前我們項目如果要用到其他額外的jar包&#xff0c;需要自己去官網下載并且導入。但是有maven后&#xff0c;直接在maven的pom.xml文件里用代碼配置即可&#xff0c;配置好后maven會自動幫我們聯網下載并且會自動導入該jar包 在右邊的maven中&#xff0c;我們可以看到下載安裝…

科學養生指南:解鎖健康生活密碼

健康是人生最寶貴的財富&#xff0c;在快節奏的現代生活中&#xff0c;科學養生成為保持良好狀態的關鍵。遵循現代醫學與營養學的研究成果&#xff0c;無需依賴傳統中醫理論&#xff0c;我們也能找到適合自己的養生之道。? 均衡飲食是健康的基石。現代營養學強調 “食物多樣&…

Qt狀態機QStateMachine

QStateMachine QState 提供了一種強大且靈活的方式來表示狀態機中的狀態&#xff0c;通過與狀態機類(QStateMachine)和轉換類(QSignalTransition&#xff0c; QEventTransition)結合&#xff0c;可以實現復雜的狀態邏輯和用戶交互。合理使用嵌套狀態機、信號轉換、動作與動畫、…

C++八股 —— 原子操作

文章目錄 1. 什么是原子操作2. 原子操作的特點3. 原子操作的底層原理4. 內存序內存屏障 5. 原子操作和互斥鎖的對比6. 常用的原子操作7. 相關問題討論 參考&#xff1a; C atomic 原子操作_c 原子操作-CSDN博客DeepSeek 1. 什么是原子操作 原子操作&#xff08;Atomic Opera…

雙紫擒龍紫紫紅指標源碼學習,2025升級版紫紫紅指標公式-重點技術

VAR1:MA((LOWHIGHCLOSE)/3,5); VAR2:CLOSEHHV(C,4) AND REF(C,1)LLV(C,4); 雙紫擒龍:REF(C,1)LLV(C,4) AND C>REF(C,2) OR REF(C,2)LLV(C,4) AND REF(C,1)<REF(C,3) AND REF(C,2)<REF(C,4) AND C>REF(C,1); VAR4:VAR1>REF(VAR1,1) AND REF(VAR1,1)<REF(VAR1,…

NeuralRecon技術詳解:從單目視頻中實現三維重建

引言 三維重建是計算機視覺領域中的一項關鍵技術&#xff0c;它能夠從二維圖像中恢復出三維形狀和結構。隨著深度學習的發展&#xff0c;基于學習的方法已經成為三維重建的主流。NeuralRecon是一種先進的三維重建方法&#xff0c;它能夠從單目視頻中實時生成高質量的三維模型。…

Ubuntu 上開啟 SSH 服務、禁用密碼登錄并僅允許密鑰認證

1. 安裝 OpenSSH 服務 如果尚未安裝 SSH 服務&#xff0c;運行以下命令&#xff1a; sudo apt update sudo apt install openssh-server2. 啟動 SSH 服務并設置開機自啟 sudo systemctl start ssh sudo systemctl enable ssh3. 生成 SSH 密鑰對&#xff08;本地機器&#xf…

MySQL 索引的增刪改查

MySQL 索引的增刪改查 1 建表時創建索引 [UNIQUE|FULLTEXT|SPATIAL] INDEX|KEY [別名] (字段名 [(長度)] [ASC|DESC] )主鍵直接寫&#xff1a; PRIMARY KEY (Id)例如&#xff1a; CREATE TABLE people (id int NOT NULL PRIMARY KEY AUTO_INCREMENT,last_name varchar(10)…

為什么現代CSS應該選擇OKLCH:從顏色科學到設計系統革新

在數字界面中&#xff0c;顏色不僅是美學的載體&#xff0c;更是信息傳遞的重要工具。CSS Color Level 4 標準引入了 OKLCH 顏色空間, 提供??感知均勻性??&#xff08;顏色差異與實際視覺感受一致&#xff09;&#xff0c;解決傳統HSL/HSV在調整顏色時的不自然問題。文本幫…

【java】小練習--零錢通

文章目錄 前言一、項目開發流程說明二、功能實現2.1 菜單2.2 零錢通明細2.3 零錢通收益2.4 零錢通消費2.5 零錢通退出確認2.6 零錢通金額校驗2.7 完整代碼 三、零錢通OOP版 前言 本文是我跟著B站韓順平老師的 Java 教程學習時動手實現“零錢通”項目的學習筆記&#xff0c;主要…

人工智能數學基礎實驗(四):最大似然估計的-AI 模型訓練與參數優化

一、實驗目的 理解最大似然估計&#xff08;MLE&#xff09;原理&#xff1a;掌握通過最大化數據出現概率估計模型參數的核心思想。實現 MLE 與 AI 模型結合&#xff1a;使用 MLE 手動估計樸素貝葉斯模型參數&#xff0c;并與 Scikit-learn 內置模型對比&#xff0c;深入理解參…

我的第1個爬蟲程序——豆瓣Top250爬蟲的詳細步驟指南

我的第1個爬蟲程序——豆瓣Top250爬蟲的詳細步驟指南 一、創建隔離開發環境 1. 使用虛擬環境&#xff08;推薦venv&#xff09; # 在項目目錄打開終端執行 python -m venv douban_env # 創建虛擬環境 source douban_env/bin/activate # Linux/macOS激活 douban_env\Scri…