導航:首頁 > 源碼編譯 > 華為編譯器面試

華為編譯器面試

發布時間:2025-08-15 06:52:28

⑴ 請問一下怎麼使用華為方舟編譯

使用華為方舟編譯器的方法主要是在手機上安裝相應的應用程序。以下是關於如何理解和使用華為方舟編譯器的詳細說明:

  1. 安裝應用程序

    • 用戶只需在手機上下載並安裝支持方舟編譯器的應用程序,即可享受方舟編譯器帶來的性能提升。
  2. 性能提升

    • 系統操作流暢度:使用方舟編譯器後,系統操作流暢度可提升24%。
    • 系統響應性能:系統響應性能也能提升44%,這意味著應用程序的啟動速度、響應速度等都會得到顯著改善。
  3. 技術背景

    • 編譯效率:華為方舟編譯器是華為公司為了提升Android系統的編譯效率而推出的一項技術。
    • 交叉編譯器套件:方舟編譯器基於GCC開發,包括了C、C++、Fortran等語言的前端以及相應的庫文件,適用於不同的架構和平台。
  4. 開源與發布

    • 首次宣布:華為在2019年4月的P30系列國內發布會上首次宣布了方舟編譯器技術。
    • 開源時間:2019年8月31日,方舟編譯器正式開源,這意味著更多的開發者和企業可以參與到方舟編譯器的優化和開發中來。

需要注意的是,雖然方舟編譯器能夠顯著提升應用程序的性能,但其具體效果可能因應用程序的類型、手機硬體性能等因素而有所不同。此外,用戶在使用方舟編譯器時,也需要確保手機系統和應用程序版本的支持情況。

⑵ 華為的一道面試題目,請幫忙看看

首先批評 鬼火狼煙 的答案

java里針對String的 + += 編譯器會自動將String轉化成StringBuffer

《java編程思想 第2版》里 附錄A:對象的傳遞和返回

中文版759頁
英文版1054頁

重載後的「+」 以及StringBuffer 小節里說

String 類的對象被設計為恆常的,並使用了前面介紹的伴隨類技術。如果查看 JDK 文檔中
的 String 類(稍後會對此進行總結),你會發現,類中每個設計修改 String 的方法,在
修改的過程中,確實生成並返回了一批新的 String 對象。最初的 String 並沒有受到影響。
C++的 const 提供由編譯器支持的對象恆常性,Java 沒有這樣的功能。想要獲得恆常對
象,你必須自己動手,就像 String 那樣。

由於 String 對象是恆常的,對某個 String 可以隨意取多個別名。因為它是只讀的,任何
引用也不可能修改該對象,也就不會影響其他引用。所以,只讀對象很好地解決了別名問
題。

這似乎可以解決所有問題。每當需要修改對象時,就創建一堆修改過的新版對象,如同
String那樣。然而,對某些操作而言,這太沒有效率了。String的重載操作符』+』就是個重
要的例子。重載是指,對特定的類,』+』被賦予額外的含義。(為String重載的』+』和』+=』,
是Java唯一重載的操作符,而且Java不允許程序員重載其他操作符。)

使用 String 對象時,』+』用來連接 String 對象:

String s = "abc" + foo + "def" + Integer.toString(47);

你可以想像它是如何工作的。String 「abc」可能有一個 append()方法,它生成了一個連接
了」abc」和 foo 的新的 String 對象。新的 String 連接」def」之後,生成另一個新的 String,
依此類推。

C++允許程序員任意重載操作符。因為這通常是很復雜的過程,Java設計者認為這是「糟糕的」功能,
不應該包括在Java

中。它其實並沒有那麼糟糕,具有諷刺意味的是,比起C++來,在Java中使用操作符重載容易多了。

這當然可以運行,但它需要大量的中間 String 對象,才能生成最終的新 String,而那些中
間結果需要作垃圾回收。我懷疑 Java 的設計者起先就是這么做的(這是軟體設計中的一個
教訓,你無法知道所有事情,直到形成代碼,並運作起來)。我猜他們發現了這種做法有
著難以忍受的低效率。

解決之道是可變的伴隨類,類似前面演示的例子。String 的伴隨類稱作 StringBuffer,在
計算某些表達式,特別是 String 對象使用重載過的』+』和』+=』時,編譯器會自動創建
StringBuffer。下面的例子說明其中發生了什麼:

//: appendixa:ImmutableStrings.java
// Demonstrating StringBuffer.
import com.bruceeckel.simpletest.*;

public class ImmutableStrings {
private static Test monitor = new Test();
public static void main(String[] args) {
String foo = "foo";
String s = "abc" + foo + "def" + Integer.toString(47);
System.out.println(s);
// The "equivalent" using StringBuffer:
StringBuffer sb =
new StringBuffer("abc"); // Creates String!
sb.append(foo);
sb.append("def"); // Creates String!
sb.append(Integer.toString(47));
System.out.println(sb);
monitor.expect(new String[] {
"abcfoodef47",
"abcfoodef47"
});
}
} ///:~

在生成 String s 的過程中,編譯器使用 sb 執行了大致與下面的工作等價的代碼:創建一
個 StringBuffer,使用 append()向此 StringBuffer 對象直接添加新的字元串(而不是每
次製作一個新的副本)。雖然這種方法更高效,但是對於引號括起的字元串,例如」abc」
和」def」,它並不起作用,編譯器會將其轉為 String 對象。所以,盡管 StringBuffer 提供
了更好的效率,可能仍會產生超出你預期數量的對象。

String 和 StringBuffer 類

下面總結了 String 與 StringBuffer 都可用的方法,你可以感受到與它們交互的方式。表
中並未包含所有方法,只包含了與本討論相關的重要方法。重載的方法被置於單獨一列。

首先是 String 類:

方法 參數,重載 用途

Constructor 重載: 預設、空參數、 創建 String 對象。
String、StringBuffer、
char 數組、byte 數組.

length( ) String 的字元數。

charAt( ) int 索引 在 String 中指定位置的
字元。

getChars( ), 復制源的起點與終點、 復 復制 char 或 byte 到外部
getBytes( ) 制的目標數組、目標數組的 數組。
索引。

toCharArray( ) 生成 char[],包含 String
的所有字元。

equals( ), 做比較的 String 兩個 String 的等價測試。
equals-IgnoreCase( )

compareTo( ) 做比較的 String 根據詞典順序比較 String
與參數,結果為負值、零、
或正值。大小寫有別。

indexOf( ), 重載: char、char 和起 如果當前 String 中不包含
lastIndexOf( ) 始索引、String、String 參數,返回-1,否則返回參
和起始索引. 數在 String 中的位置索引。
LastIndexOf()由末端反
向搜索。

substring( ) 重載: 起始索引、起始索引 返回新的 String 對象,包
和終止索引 含特定的字元集。

concat( ) 要連接的 String 返回新 String 對象,在原
String 後追加參數字元。

replace( ) 搜索的舊字元,用來替代的 返回指定字元被替換後的新
新字元 String 對象。如果沒有發生
替換,返回原 String。

成一個且僅生成一個 String
引用。

可以看到,當必須修改字元串的內容時,String的每個方法都會謹慎地返回一個新的String
對象。還要注意,如果內容不需要修改,方法會返回指向源 String 的引用。這節省了存儲
空間與開銷。

以下是 StringBuffer 類:

方法 參數, 重載 用途

Constructor 重載: 空參數、要創建的緩沖區 創建新的 StringBuffer
長度、String 的來源. 對象。

toString( ) 由此 StringBuffer 生成
String。

length( ) StringBuffer 中的字元
個數。

setLength( ) 代表緩沖區中字元串長度的整數 截短或擴展原本的字元串。
如果擴展,以 null 填充新
增的空間。

charAt( ) 代表所需元素位置的整數。 返回 char 在緩沖區中的
位置。

setCharAt( ) 代表所需元素位置的整數,和新 修改某位置上的值。
的 char 值

getChars( ) 復制源的起點與終點、復制的目 復制 char 到外圍數組。沒
的端數組、目的端數組的索引。 有 String 中的
getBytes( ) 。

append( ) 重載: Object、String、 參數轉為字元串,然後追加

char[]、char[] 和偏移和長 到當前緩沖區的末端,如果
度、boolean、char、int、 必要,緩沖區會擴大。
long、float、double.

insert( ) 被重載過,第一個參數為插入起 第二個參數轉為字元串,插
始點的偏移值: Object、 入到當前緩沖區的指定位
String、char[]、boolean、置。如果必要,緩沖區會擴
char、int、long、float、 大。
double.

最常用的方法是 append(),當計算包含』+』和』+=』操作符的 String 表達式時,編譯器會使
用它。Insert()方法有類似的形式,這兩個方法都會在緩沖區中進行大量操作,而不需創建
新對象。

String 是特殊的

到目前為止,你已經看到了,String 類不同於 Java 中一般的類。 String 有很多特殊之處,
它不僅僅只是一個 Java 內置的類,它已經成為 Java 的基礎。而且事實上,雙引號括起的
字元串都被編譯器轉換為 String 對象,還有專門重載的』+』和』+=』操作符。在本附錄中,
你還能看到其他特殊之處:使用伴隨類 StringBuffer 精心建構的恆常性,以及編譯器中的
一些額外的魔幻式的功能。

/**********
對象操作效率低下
況且java的對象都在堆里
原文對對象重復進行操作
純粹是傻瓜蛋行為
**********/
// **********************************************************

public static String countStr(int count)
{
char ch [ ] = new char[count];

for(int i = 0; i < count; i++)
ch [i] = 'A';

String str = new String(ch);

return str;
}

// **********************************************************

閱讀全文

與華為編譯器面試相關的資料

熱點內容
程序員唯美圖像 瀏覽:921
大衛休謨英國史pdf 瀏覽:255
1年工作經驗的程序員找工作 瀏覽:129
桌面文件夾位置自動就變了 瀏覽:417
同時操作文件夾 瀏覽:152
程序員看視頻為什麼不需要vip 瀏覽:870
哪個訂票app好 瀏覽:206
ddnet怎麼自己開伺服器 瀏覽:16
java反射調用函數 瀏覽:604
看圍棋講解視頻用哪個app 瀏覽:941
關屏app哪個好 瀏覽:262
富民村鎮銀行手機app現在叫什麼 瀏覽:446
電氣專業可以做程序員么 瀏覽:203
c語言編譯過程中可發現什麼錯誤 瀏覽:765
程序員考什麼高級 瀏覽:445
摩根士丹利加密交易平台 瀏覽:819
如何修改手機編譯時間 瀏覽:989
壓縮機管不冷 瀏覽:674
控制器單片機固件 瀏覽:216
狼人殺伺服器怎麼填 瀏覽:406