1.什麼是記憶體對齊?記憶體對齊有什麼意義?2. 請簡述c++中函式呼叫過程並解釋棧幀的概念。(可以舉例說明)
針對記憶體對齊,以下例子:
typedef
struct
b;
typedef
struct
a;
分別對他們求大小,sizeof(a),sizeof(b)我們所得到的結果是不同的,
sizeof(a)=24而sizeof(b)=16為什麼會產生不一樣的結果呢?
這是非常簡單的乙個例子,體現了結構體的記憶體對齊規則。
在結構體中,從結構體的首位址開始,假設位址從0開始。
對結構體a來說,a佔4個位元組,佔從03的位元組,b是double型別佔8個位元組,佔從815的位元組,c佔兩個位元組,從16~17的位元組。
對結構體b來說,a佔4個位元組,從03,b佔兩個位元組從46;c佔8個位元組從8~15。
這就是記憶體對齊,對齊規則是按照成員的宣告順序,依次安排記憶體,其偏移量為成員大小的整數倍,0看做任何成員的整數倍,最後結構體的大小為最大成員的整數倍(所以這裡的a的大小是24,而不是18)。
為什麼要記憶體對齊?
1.平台原因(移植原因):不是所有的硬體平台都能訪問任意位址上的任意資料的;某些硬體平台只能在某些位址處取某些特定型別的資料,否則丟擲硬體異常。
2.效能原因:資料結構(尤其是棧)應該盡可能地在自然邊界上對齊。原因在於,為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問;而對齊的記憶體訪問僅需要一次訪問。
2.給你乙個由若干 0 和 1 組成的字串s,請你計算並返回將該字串分割成兩個子字串(即左子字串和右子字串, 子字串允許為空)所能獲得的最大得分。
已知分割字串的得分規則如下:
左子字串中:0得2分,1得1分
右子字串中:1得2分,0得1分
子字串為空則得0分
#include
using
namespace std;
intmain()
for(
int i =
0;i < str.
size()
;i++
) cur = i+1;
while
(cur < str.
size()
)if(sum > ret)
ret = sum;
} cout << ret
}
3.已知摩爾斯電碼和字元對映關係如下:
a -> 0
b -> 1
c -> 10
d -> 11
e -> 100
f -> 101
g -> 110
h -> 111
當前我們獲取到了一串01數字字串,需要進行摩爾斯電碼解碼,請問共有多少種解碼方法?
#include
#include
using
namespace std;
intmain()
if(i+
2< n)}}
cout<< dp[0]
}
4.大富翁遊戲規則如下
玩家起始會獲得一定資本m金幣
玩家每一次可以走乙個格,或者跳兩個格;走一格耗費2個金幣能量;跳兩個格,耗費3個金幣能量;金幣只有滿足能量消耗時,才能繼續往下走
玩家每走到乙個格,會得到這個格的獎勵,每個格的獎勵金幣數為非負整數
當玩家走到這個格後,總金幣數不足以支援下一步金幣消耗時,則不能繼續往下走,遊戲結束
玩家第一步可以選擇走一步進第1格或者跳2步進第2格起始,玩家可以選擇在任意一格結束遊戲
問玩家遊戲中,最多能得到多少個金幣?
#include
#include
using
namespace std;
intmain()
int ret =0;
vector<
int>
dp(nums.
size()
+1,0
);dp[0]
= sum;
for(
int i =
1;i <= nums.
size()
;i++
)//nums的下標比dp的下標小1
if(i-
2>=
0&&dp[i-2]
>=3)
ret =
max(ret, dp[i]);
} cout << ret;
return0;
}
5.網易嚴選建有n個自營倉分布在全國各地,標記為倉庫1到n。
給定乙個配貨時間組(v,u,w),v為出發倉庫,u為目標倉庫,w為從出發倉庫到目標倉庫的耗時時間。可能存在倉庫間過遠,無法支援調撥轉貨。
指定乙個出發倉庫k,我們需要將**商傳送到k倉庫的貨配送到各個倉庫。問配送到所有可到達倉庫所要最短時間?如果無法全部調撥到,則返回-1.
python3
def solution
(start, graph, n)
: passed =
[start]
nopass =
[x for x in range(1
, n +1)
if x != start]
dis = graph[start]
while
len(nopass)
: idx = nopass[0]
# 選出距離起點最近的點
for i in nopass:
if dis[i]
< dis[idx]
: idx = i
nopass.
remove
(idx)
passed.
(idx)
# 更新距離
for i in nopass:
if dis[i]
> dis[idx]
+ graph[idx]
[i]:
dis[i]
= dis[idx]
+ graph[idx]
[i]return
max(dis[1:
])ifmax
(dis[1:
])!=float
("inf"
)else-1
n, k, m =
input()
.strip()
.split
(' '
)n, k, m =
int(n)
,int
(k),
int(m)
graph =[[
float
("inf")]
*(n +1)
for _ in range
(n +1)
]for i in range
(n +1)
: graph[i]
[i]=
0for _ in range
(m):
s, t, d =
input()
.strip()
.split
(' '
) s, t, d =
int(s)
,int
(t),
int(d)
graph[s]
[t]=
min(d, graph[s]
[t])
print
(solution
(k, graph, n)
)
iOS程式設計 學習篇(四)
從語法上看,類方法的宣告和例項方法的宣告不同,差別在於第乙個字元。在返回型別的前面,例項方法使用的是字元 而類方法使用的是字元 tips 標頭檔案宣告順序 例項變數宣告應該寫在最前面,然後是類檔案,接下來是初始化方法,最後是其他方法。這種排序是一種約定。instancetype randomitem...
python核心程式設計學習(四)
乙個計算簡單加減法的例子 created on 2012 3 7 author administrator usr bin env python from operator import add,sub from random import randint,choice ops maxtries 2...
Python程式設計學習筆記(四)
a 3b 4print a b 7print b a 1print a b 12 print b a 1.33333333333 print b a 1print b a 1print a b 81 x 6x 3print x 9 x 6x 3print x 3 x 6x 3print x 18 x...