1.使ç¨sizeof计ç®ç±»ç大å°
2.C++ 关于size()和sizeof()
3.sizeof(string)为ä½è¿å4ï¼
使ç¨sizeof计ç®ç±»ç大å°
ç±»çsizeof大å°ä¸è¬æ¯ç±»ä¸çæææåçsizeof大å°ä¹åï¼è¿ä¸ªå°±ä¸ç¨å¤è¯´ã
ä¸è¿æ两ç¹éè¦æ³¨æï¼1ï¼å½ç±»ä¸å«æèæåå½æ°çæ¶åï¼ä¾å¦ï¼
class B
{
float a;
public:
virtual void fun(void);
}
æ¤æ¶sizeof(B)ç大å°ä¸º8ï¼èä¸æ¯4ãå 为å¨ç±»ä¸éèäºä¸ä¸ªæéï¼è¯¥æéæåèå½æ°è¡¨ï¼æ£å 为å¦æ¤ï¼
使å¾C++è½å¤æ¯æå¤æï¼å³å¨è¿è¡æ¶ç»å®å½æ°çå°åã
2ï¼å¦ä¸ä¸ªè¦æ³¨æçæ¯ï¼å½ç±»ä¸æ²¡æä»»ä½æååéï¼ä¹æ²¡æèå½æ°çæ¶åï¼è¯¥ç±»ç大å°æ¯å¤å°å¢ï¼
ä¾å¦ï¼
class B2
{
void fun(void);
}
æ¤æ¶sizeof(B2)çå¼æ¯å¤å°å¢ï¼å¨C++æ©æçç¼è¯å¨ä¸ï¼è¿ä¸ªå¼ä¸º0ï¼ç¶èå½å建è¿æ ·ç对象æ¶ï¼
å®ä»¬ä¸ç´§æ¥çå®ä»¬åé¢ç对象æç¸åçå°åãæ¯å¦ï¼
B2 b2;
int a;
é£ä¹å¯¹è±¡b2ä¸åéaæç¸åçå°åï¼è¿æ ·çè¯å¯¹å¯¹è±¡b2å°åçæä½å°±ä¼å½±ååéaãæ以å¨ç°å¨å¤§å¤æ°ç¼è¯å¨ä¸ï¼è¯¥å¼ç大å°ä¸º1ã
å¦ææèå½æ°ï¼åsizeofå¼ä¸ºç±»çæ°æ®æåç大å°å ä¸VTBLï¼æéï¼4åèï¼ï¼åå ä¸å ¶åºç±»çæ°æ®æåç大å°ãå¦ææ¯å¤é继æ¿ï¼è¿å¾å ä¸ååºç±»çVTBLã
è¿ä¸ªé®é¢å¾éº»ç¦.. ä¸é¢ææ´è¯¦ç»çèªå·±çä¸
blogs.com/archive////.aspx
C++ 关于size()和sizeof()
在C++编程中,两个常用的码分码分操作符size()和sizeof()具有不同的功能。首先,析s析size()函数主要用于获取字符串的类sg类长度,与C++之前的码分码分baner轮播源码length()函数用法相似。例如,析s析74的源码当你定义一个字符串`string str = "";`时,类sg类`str.length()`会返回,码分码分而`str.size()`也同样得到。析s析虽然两个函数功能相同,类sg类但size()是码分码分为兼容C++标准模板库(STL)而引入的,它作为容器类的析s析特性,便于与STL算法配合使用。类sg类79的源码值得注意的码分码分是,不论字符串中包含何种字符,析s析包括汉字,size()和length()返回的ipad 源码查看都是字节数。
相比之下,sizeof()是一个运算符,它在编译时就已经计算出参数的字节数。它可以应用于各种类型,早期 打卡 源码如数组、指针、类型、对象和函数。例如,对于一个字符指针`char* ss = "";`,`sizeof(ss)`返回的是4,因为这表示指针本身所占的空间大小。而`sizeof(*ss)`则为1,因为它是计算第一个字符的字节数。重要的是,sizeof()不能用于动态分配内存的大小计算,因为它在编译时就确定了,而动态分配的内存大小是运行时才决定的。因此,这两个操作符在C++中各有其特定用途和适用场景。
sizeof(string)为ä½è¿å4ï¼
ç»æä½çsizeof
è¿æ¯åå¦è é®å¾æå¤çä¸ä¸ªé®é¢ï¼æ以è¿éæå¿ è¦å¤è´¹ç¹ç¬å¢¨ã让æ们å çä¸ä¸ªç»æä½ï¼
struct S1
{
char c;
int i;
};
é®sizeof(s1)çäºå¤å°èªæçä½ å¼å§æèäºï¼charå 1个åèï¼intå 4个åèï¼é£ä¹å èµ·æ¥å°±åºè¯¥æ¯5ãæ¯è¿æ ·åä½ å¨ä½ æºå¨ä¸è¯è¿äºåä¹è®¸ä½ æ¯å¯¹çï¼ä½å¾å¯è½ä½ æ¯éçï¼VC6ä¸æé»è®¤è®¾ç½®å¾å°çç»æ为8ã
Why为ä»ä¹å伤çæ»æ¯æ
请ä¸è¦æ²®ä¸§ï¼æ们æ¥å¥½å¥½ç¢ç£¨ä¸ä¸sizeofçå®ä¹ââsizeofçç»æçäºå¯¹è±¡æè ç±»åæå çå ååèæ°ï¼å¥½å§ï¼é£å°±è®©æ们æ¥ççS1çå ååé æ åµï¼
S1 s1 = { 'a', 0xFFFFFFFF };
å®ä¹ä¸é¢çåéåï¼å ä¸æç¹ï¼è¿è¡ç¨åºï¼è§å¯s1æå¨çå åï¼ä½ åç°äºä»ä¹
以æçVC6.0为ä¾ï¼s1çå°å为0xFFï¼å ¶æ°æ®å 容å¦ä¸ï¼
FF: CC CC CC FF FF FF FF
åç°äºä»ä¹æä¹ä¸é´å¤¹æäº3个åèçCCççMSDNä¸ç说æï¼
When applied to a structure type or variable, sizeof returns the actual size, which may include padding bytes inserted for alignment.
åæ¥å¦æ¤ï¼è¿å°±æ¯ä¼ 说ä¸çåè对é½åï¼ä¸ä¸ªéè¦çè¯é¢åºç°äºã
为ä»ä¹éè¦åè对é½è®¡ç®æºç»æåçæ导æ们è¿æ ·æå©äºå 快计ç®æºçåæ°é度ï¼å¦åå°±å¾å¤è±æ令å¨æäºã为æ¤ï¼ç¼è¯å¨é»è®¤ä¼å¯¹ç»æä½è¿è¡å¤çï¼å®é ä¸å ¶å®å°æ¹çæ°æ®åéä¹æ¯å¦æ¤ï¼ï¼è®©å®½åº¦ä¸º2çåºæ¬æ°æ®ç±»åï¼shortçï¼é½ä½äºè½è¢«2æ´é¤çå°åä¸ï¼è®©å®½åº¦ä¸º4çåºæ¬æ°æ®ç±»åï¼intçï¼é½ä½äºè½è¢«4æ´é¤çå°åä¸ï¼ä»¥æ¤ç±»æ¨ãè¿æ ·ï¼ä¸¤ä¸ªæ°ä¸é´å°±å¯è½éè¦å å ¥å¡«å åèï¼æ以æ´ä¸ªç»æä½çsizeofå¼å°±å¢é¿äºã
让æ们交æ¢ä¸ä¸S1ä¸charä¸intçä½ç½®ï¼
struct S2
{
int i;
char c;
};
ççsizeof(S2)çç»æ为å¤å°ï¼æä¹è¿æ¯8åççå åï¼åæ¥æåcåé¢ä»ç¶æ3个填å åèï¼è¿åæ¯ä¸ºä»ä¹åå«çæ¥ï¼ä¸é¢æ»ç»è§å¾ã
åè对é½çç»èåç¼è¯å¨å®ç°ç¸å ³ï¼ä½ä¸è¬èè¨ï¼æ»¡è¶³ä¸ä¸ªååï¼
1) ç»æä½åéçé¦å°åè½å¤è¢«å ¶æ宽åºæ¬ç±»åæåç大å°ææ´é¤ï¼
2) ç»æä½æ¯ä¸ªæåç¸å¯¹äºç»æä½é¦å°åçå移éï¼offsetï¼é½æ¯æå大å°çæ´æ°åï¼å¦æéè¦ç¼è¯å¨ä¼å¨æåä¹é´å ä¸å¡«å åèï¼internal addingï¼ï¼
3) ç»æä½çæ»å¤§å°ä¸ºç»æä½æ宽åºæ¬ç±»åæå大å°çæ´æ°åï¼å¦æéè¦ç¼è¯å¨ä¼å¨ææ«ä¸ä¸ªæåä¹åå ä¸å¡«å åèï¼trailing paddingï¼ã
对äºä¸é¢çååï¼æå ç¹éè¦è¯´æï¼
1) åé¢ä¸æ¯è¯´ç»æä½æåçå°åæ¯å ¶å¤§å°çæ´æ°åï¼æä¹å说å°å移éäºå¢å 为æäºç¬¬1ç¹åå¨ï¼æ以æ们就å¯ä»¥åªèèæåçå移éï¼è¿æ ·æèèµ·æ¥ç®åãæ³æ³ä¸ºä»ä¹ã
ç»æä½æ个æåç¸å¯¹äºç»æä½é¦å°åçå移éå¯ä»¥éè¿å®offsetof()æ¥è·å¾ï¼è¿ä¸ªå®ä¹å¨stddef.hä¸å®ä¹ï¼å¦ä¸ï¼
#define offsetof(s,m) (size_t)&(((s *)0)->m)
ä¾å¦ï¼æ³è¦è·å¾S2ä¸cçå移éï¼æ¹æ³ä¸º
size_t pos = offsetof(S2, c);// posçäº4
2) åºæ¬ç±»åæ¯æåé¢æå°çåcharãshortãintãfloatãdoubleè¿æ ·çå ç½®æ°æ®ç±»åï¼è¿éæ说çâæ°æ®å®½åº¦âå°±æ¯æå ¶sizeofç大å°ãç±äºç»æä½çæåå¯ä»¥æ¯å¤åç±»åï¼æ¯å¦å¦å¤ä¸ä¸ªç»æä½ï¼æ以å¨å¯»æ¾æ宽åºæ¬ç±»åæåæ¶ï¼åºå½å æ¬å¤åç±»åæåçåæåï¼èä¸æ¯æå¤åæåçææ¯ä¸ä¸ªæ´ä½ãä½å¨ç¡®å®å¤åç±»åæåçå移ä½ç½®æ¶åæ¯å°å¤åç±»åä½ä¸ºæ´ä½çå¾ ã
è¿éåè¿°èµ·æ¥æç¹æå£ï¼æèèµ·æ¥ä¹æç¹æ 头ï¼è¿æ¯è®©æ们ççä¾åå§ï¼å ·ä½æ°å¼ä»ä»¥VC6为ä¾ï¼ä»¥åä¸å说æï¼ï¼
struct S3
{
char c1;
S1 s;
char c2;
};
S1çæ宽ç®åæåçç±»å为intï¼S3å¨èèæ宽ç®åç±»åæåæ¶æ¯å°S1âææ£âççï¼æ以S3çæ宽ç®åç±»å为intï¼è¿æ ·ï¼éè¿S3å®ä¹çåéï¼å ¶åå¨ç©ºé´é¦å°åéè¦è¢«4æ´é¤ï¼æ´ä¸ªsizeof(S3)çå¼ä¹åºè¯¥è¢«4æ´é¤ã
c1çå移é为0ï¼sçå移éå¢è¿æ¶sæ¯ä¸ä¸ªæ´ä½ï¼å®ä½ä¸ºç»æä½åéä¹æ»¡è¶³åé¢ä¸ä¸ªååï¼æä»¥å ¶å¤§å°ä¸º8ï¼å移é为4ï¼c1ä¸sä¹é´ä¾¿éè¦3个填å åèï¼èc2ä¸sä¹é´å°±ä¸éè¦äºï¼æ以c2çå移é为ï¼ç®ä¸c2ç大å°ä¸ºï¼æ¯ä¸è½è¢«4æ´é¤çï¼è¿æ ·æ«å°¾è¿å¾è¡¥ä¸3个填å åèãæåå¾å°sizeof(S3)çå¼ä¸ºã
éè¿ä¸é¢çåè¿°ï¼æ们å¯ä»¥å¾å°ä¸ä¸ªå ¬å¼ï¼
ç»æä½ç大å°çäºæåä¸ä¸ªæåçå移éå ä¸å ¶å¤§å°åå ä¸æ«å°¾çå¡«å åèæ°ç®ï¼å³ï¼
sizeof( struct ) = offsetof( last item ) + sizeof( last item ) + sizeof( trailing padding )
å°è¿éï¼æå们åºè¯¥å¯¹ç»æä½çsizeofæäºä¸ä¸ªå ¨æ°ç认è¯ï¼ä½ä¸è¦é«å ´å¾å¤ªæ©ï¼æä¸ä¸ªå½±åsizeofçéè¦åéè¿æªè¢«æåï¼é£ä¾¿æ¯ç¼è¯å¨çpackæ令ãå®æ¯ç¨æ¥è°æ´ç»æä½å¯¹é½æ¹å¼çï¼ä¸åç¼è¯å¨å称åç¨æ³ç¥æä¸åï¼VC6ä¸éè¿#pragma packå®ç°ï¼ä¹å¯ä»¥ç´æ¥ä¿®æ¹/Zpç¼è¯å¼å ³ã#pragma packçåºæ¬ç¨æ³ä¸ºï¼#pragma pack( n )ï¼n为åè对é½æ°ï¼å ¶åå¼ä¸º1ã2ã4ã8ãï¼é»è®¤æ¯8ï¼å¦æè¿ä¸ªå¼æ¯ç»æä½æåçsizeofå¼å°ï¼é£ä¹
该æåçå移éåºè¯¥ä»¥æ¤å¼ä¸ºåï¼å³æ¯è¯´ï¼ç»æä½æåçå移éåºè¯¥åäºè çæå°å¼ï¼
å ¬å¼å¦ä¸ï¼
offsetof( item ) = min( n, sizeof( item ) )
åç示ä¾ï¼
#pragma pack(push) // å°å½åpack设置åæ ä¿å
#pragma pack(2) // å¿ é¡»å¨ç»æä½å®ä¹ä¹å使ç¨
struct S1
{
char c;
int i;
};
struct S3
{
char c1;
S1 s;
char c2;
};
#pragma pack(pop) // æ¢å¤å åçpack设置
计ç®sizeof(S1)æ¶ï¼min(2, sizeof(i))çå¼ä¸º2ï¼æ以içå移é为2ï¼å ä¸sizeof(i)çäº6ï¼è½å¤è¢«2æ´é¤ï¼æ以æ´ä¸ªS1ç大å°ä¸º6ã
åæ ·ï¼å¯¹äºsizeof(S3)ï¼sçå移é为2ï¼c2çå移é为8ï¼å ä¸sizeof(c2)çäº9ï¼ä¸è½è¢«2æ´é¤ï¼æ·»å ä¸ä¸ªå¡«å åèï¼æ以sizeof(S3)çäºã
ç°å¨ï¼æå们å¯ä»¥è½»æ¾çåºä¸å£æ°äºï¼:)
è¿æä¸ç¹è¦æ³¨æï¼â空ç»æä½âï¼ä¸å«æ°æ®æåï¼ç大å°ä¸ä¸º0ï¼èæ¯1ãè¯æ³ä¸ä¸ªâä¸å 空é´âçåéå¦ä½è¢«åå°åã两个ä¸åçâ空ç»æä½âåéåå¦ä½å¾ä»¥åºåå¢äºæ¯ï¼â空ç»æä½âåéä¹å¾è¢«åå¨ï¼è¿æ ·ç¼è¯å¨ä¹å°±åªè½ä¸ºå ¶åé ä¸ä¸ªåèç空é´ç¨äºå ä½äºãå¦ä¸ï¼
struct S5 { };