sse优化一例
【摘要】 前两天为了加速一段求梯度的代码,用了SSE指令,在实验室PMH大侠的指导下,最终实现了3倍速度提升(极限是4倍,因为4个浮点数一起计算)。在这里写一下心得,欢迎拍砖。
SSE加速的几个关键是
(1) 用于并行计算的数据结构要16字节对齐
(2) 直接写汇编,不要用SSE的Load Store指令
(3) 对于SSE本身不提供的三角函数等指令,可以用查表法,但要用S...
1
// 计算梯度的代码
2
for ( int s = 1 ; s < (GetCount() - 1 ) ; ++ s) {
3
for (int y = 1 ; y < (imgScaled[s]->Height() - 1) ; ++y) {
4
for (int x = 1 ; x < (imgScaled[s]->Width() - 1) ; ++x) {
5
float gy= imgScaled[s]->At(x, y + 1) - imgScaled[s]->At(x, y - 1);
6
float gx = imgScaled[s]->At(x + 1, y) - imgScaled[s]->At(x - 1, y);
7![](https://res.hc-cdn.com/ecology/9.3.157/v2_resources/ydcomm/libs/images/loading.gif)
8
magnitudes[s]->At(x, y) = sqrt(gx*gx + gy*gy);
9
directions[s]->At(x, y) = AtanLookupF32::Value(gy, gx);
10
}
11
}
12
}
13![](https://res.hc-cdn.com/ecology/9.3.157/v2_resources/ydcomm/libs/images/loading.gif)
14
// arctan 查表函数
15
static inline float AtanLookupF32::Value( float y, float x) {
16
float N_DOUBLE = 4 * 4096;
17
if( x > 0.0 ){
18
if( y > 0.0 )
19
return m_dATAN_LU[(int)(N_DOUBLE * y / ( x + y ))];
20
else
21
return -m_dATAN_LU[(int)(N_DOUBLE * (-y) / ( x - y ))];
22
}
23![](https://res.hc-cdn.com/ecology/9.3.157/v2_resources/ydcomm/libs/images/loading.gif)
24
if( x == 0.0 ){
25
if( y > 0 )
26
return LU_PI/2;
27
else
28
return -LU_PI/2;
29
}
30![](https://res.hc-cdn.com/ecology/9.3.157/v2_resources/ydcomm/libs/images/loading.gif)
31
if( y < 0.0 )
32
return m_dATAN_LU[(int)(N_DOUBLE * y / ( x + y ))] - LU_PI;
33
else
34
return -m_dATAN_LU[(int)(N_DOUBLE * (-y) / ( x - y ))] + LU_PI;
35
}
36
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
2
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
4
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
5
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
6
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
7
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
8
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
9
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
10
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
11
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
12
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
13
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
14
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
15
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
16
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
17
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
18
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
19
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
20
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
21
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
22
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
23
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
24
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
25
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
26
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
27
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
28
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
29
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
30
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
31
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
32
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
33
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
34
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
35
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
36
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
1
template < typename T >
2
class ImageArray
3
{
4
protected:
5
int m_nWidth;
6
int m_nHeight;
7![](https://res.hc-cdn.com/ecology/9.3.157/v2_resources/ydcomm/libs/images/loading.gif)
8
// 16字节补齐后的实际宽度,单位为 sizeof(float)
9
int m_nWidthActual;
10![](https://res.hc-cdn.com/ecology/9.3.157/v2_resources/ydcomm/libs/images/loading.gif)
11
// 积分图像,用来加速图像的区域求和用
12
ImageArray* m_pImageIntegral;
13![](https://res.hc-cdn.com/ecology/9.3.157/v2_resources/ydcomm/libs/images/loading.gif)
14
// 计算补足后的长度
15
static __forceinline int expandAlign(int w){
16
return w + 3 - (w - 1) % 4;
17
}
18![](https://res.hc-cdn.com/ecology/9.3.157/v2_resources/ydcomm/libs/images/loading.gif)
19
// 数据
20
T* m_afData;
21
T** m_aafEntry;
22![](https://res.hc-cdn.com/ecology/9.3.157/v2_resources/ydcomm/libs/images/loading.gif)
23
typedef T* PointerType;
24
typedef T** EntryType;
25![](https://res.hc-cdn.com/ecology/9.3.157/v2_resources/ydcomm/libs/images/loading.gif)
26
void SetSize(int height, int width){
27
m_nWidth = width;
28
m_nHeight = height;
29
m_nWidthActual = expandAlign(width);
30![](https://res.hc-cdn.com/ecology/9.3.157/v2_resources/ydcomm/libs/images/loading.gif)
31
// 16字节对齐的分配
32
m_afData = (T*)_aligned_malloc(sizeof(T) * m_nWidthActual * m_nHeight, 16);
33![](https://res.hc-cdn.com/ecology/9.3.157/v2_resources/ydcomm/libs/images/loading.gif)
34
// 这一部分是加速索引,参考Wild Magic Lib里的GMatrix类
35
m_aafEntry = new PointerType[m_nHeight];
36
T* ptr = m_afData;
37
for(int i=0;i<m_nHeight;i++){
38
m_aafEntry[i] = ptr;
39
ptr += m_nWidthActual;
40
}
41![](https://res.hc-cdn.com/ecology/9.3.157/v2_resources/ydcomm/libs/images/loading.gif)
42
if(m_pImageIntegral)
43
delete m_pImageIntegral;
44
m_pImageIntegral = NULL;
45
}
46![](https://res.hc-cdn.com/ecology/9.3.157/v2_resources/ydcomm/libs/images/loading.gif)
47
public:
48![](https://res.hc-cdn.com/ecology/9.3.157/v2_resources/ydcomm/libs/images/loading.gif)
49
ImageArray():m_pImageIntegral(NULL){SetSize(0, 0);}
50![](https://res.hc-cdn.com/ecology/9.3.157/v2_resources/ydcomm/libs/images/loading.gif)
51
ImageArray(int width, int height):m_pImageIntegral(NULL){
52
SetSize(height, width);
53
}
54![](https://res.hc-cdn.com/ecology/9.3.157/v2_resources/ydcomm/libs/images/loading.gif)
55
ImageArray(const ImageArray& that):m_pImageIntegral(NULL){
56
SetSize(that.Height(), that.Width());
57
memcpy(m_afData, that.m_afData, sizeof(T) * that.m_nWidthActual * that.m_nHeight);
58
}
59![](https://res.hc-cdn.com/ecology/9.3.157/v2_resources/ydcomm/libs/images/loading.gif)
60
~ImageArray(){
61
if(m_pImageIntegral)
62
delete m_pImageIntegral;
63
if(m_aafEntry)
64
delete []m_aafEntry;
65![](https://res.hc-cdn.com/ecology/9.3.157/v2_resources/ydcomm/libs/images/loading.gif)
66
// 对应的释放
67
if(m_afData)
68
_aligned_free(m_afData);
69
}
70![](https://res.hc-cdn.com/ecology/9.3.157/v2_resources/ydcomm/libs/images/loading.gif)
71
void CreateDataArray(int width, int height){
72
m_nWidthActual = expandAlign(width);
73
SetSize(height, m_nWidthActual);
74
m_nWidth = width;
75
m_nHeight = height;
76
}
77![](https://res.hc-cdn.com/ecology/9.3.157/v2_resources/ydcomm/libs/images/loading.gif)
78
__forceinline T& At(int x, int y){
79
_ASSERT(m_afData);
80
_ASSERT(x >= 0 && x < m_nWidth && y >= 0 && y < m_nHeight);
81
return m_aafEntry[y][x];
82
}
83![](https://res.hc-cdn.com/ecology/9.3.157/v2_resources/ydcomm/libs/images/loading.gif)
84
__forceinline const int Width() const {return m_nWidth;}
85
__forceinline const int Height() const {return m_nHeight;}
86![](https://res.hc-cdn.com/ecology/9.3.157/v2_resources/ydcomm/libs/images/loading.gif)
87
// 建立移位的图像
88
void fillShiftedImage(int shift, ImageArray<T>& dst)
89
{
90
for(int i=0;i<m_nHeight;i++)
91
{
92
memcpy(dst[i], m_aafEntry[i] + shift, sizeof(T) * (m_nWidthActual - shift));
93
}
94
}
95![](https://res.hc-cdn.com/ecology/9.3.157/v2_resources/ydcomm/libs/images/loading.gif)
96
//
以下省略
97
} ;
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
2
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
3
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
4
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
5
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
6
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
7
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
8
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
9
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
10
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
11
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
12
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
13
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
14
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
15
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
16
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
17
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
18
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
19
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
20
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
21
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
22
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
23
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
24
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
25
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
26
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
27
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
28
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
29
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
30
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
31
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
32
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
33
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
34
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
35
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
36
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
37
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
38
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
39
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
40
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
41
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
42
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
43
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
44
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
45
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
46
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
47
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
48
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
49
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
50
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
51
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
52
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
53
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
54
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
55
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
56
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
57
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
58
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
59
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
60
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
61
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
62
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
63
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
64
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
65
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
66
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
67
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
68
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
69
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
70
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
71
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
72
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
73
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
74
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
75
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
76
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
77
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
78
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
79
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
80
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
81
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
82
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
83
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
84
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
85
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
86
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
87
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
88
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
89
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
90
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
91
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
92
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
93
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
94
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
95
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
96
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/dot.gif)
97
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
1
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
2
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
3
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
4
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
5
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
6
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
7
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
8
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
9
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
10
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
11
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
12
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
13
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
14
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
15
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
16
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
17
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
18
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
19
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
20
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
21
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
22
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
23
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
24
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
25
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
26
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
27
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
28
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
29
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
30
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
31
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
32
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
33
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
34
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
35
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
36
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
37
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
38
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
39
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
40
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
41
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
42
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
43
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
44
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
45
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
46
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
47
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
48
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
49
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
50
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
51
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
52
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
53
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
54
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
55
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
56
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
57
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
58
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
59
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
60
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
61
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
62
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
63
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
64
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
65
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
66
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
67
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
68
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
69
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
70
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
71
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
72
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
73
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
74
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
75
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
76
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
77
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
78
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
79
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
80
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
81
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
82
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
83
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
84
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
85
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
86
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
87
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
88
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
89
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
90
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
91
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
92
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
93
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
94
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
95
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
96
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
97
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
98
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
99
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
100
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
101
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
102
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
103
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
104
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
105
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
106
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
107
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
108
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
109
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
110
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
111
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
112
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
113
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/dot.gif)
114
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
115
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
116
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
117
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
118
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
119
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
120
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
121
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
122
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
123
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
124
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
125
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
126
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
127
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
128
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
129
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
130
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
131
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
132
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
133
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
134
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
135
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
136
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
137
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
138
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
139
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
140
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
141
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
142
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
143
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
144
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
145
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
146
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
147
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
148
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
149
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
150
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
151}
原文:http://www.cppblog.com/fbitw/archive/2007/05/04/23287.html
文章来源: blog.csdn.net,作者:网奇,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/jacke121/article/details/54706128
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)