实现一个内存池管理的类方法

2025-05-27 0 39

模拟STL中的freelist,有这个思想在内。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104
union obj

{

union obj* next;

char p[1];

};

class MemoryPool

{

public:

MemoryPool()

{

union obj* temp;

m_memory.assign(5,(union obj*)NULL);

for(int i=0;i<m_memory.size();i++)

{

for(int j=0;j<m_memory.size();j++)

{

temp = (obj*)malloc(sizeof(char)*(1<<(i+3)));

temp->next = m_memory[i];

m_memory[i] = temp;

}

}

}

char* mem_get(int size)

{

int j;

if( size > 128)

{

char* start = (char*)malloc(sizeof(char)*size);

return start;

}

int index = freelist_index(size);

obj* temp = m_memory[index];

if(temp == NULL) //

{

for(j = index+1;j<m_memory.size();j++)

{

temp = m_memory[j];

if(temp != NULL)

{

m_memory[j] = temp->next;

break;

}

}

if(j>= m_memory.size())

{

for(int j=0;j<m_memory.size();j++)

{

temp = (obj*)malloc(sizeof(char)*(1<<(index+3)));

temp->next = m_memory[index];

m_memory[index] = temp;

}

temp = m_memory[index];

m_memory[index] = temp->next;

return (char*)temp;

}

else

{

obj* cur;

int up_size = round_up(size);

for(int i=0;i<(1<<(j-index));i++)

{

cur = temp;

cur->next = m_memory[index];

m_memory[index] = cur;

temp = cur+up_size;

}

temp = m_memory[index];

m_memory[index] = temp->next;

return (char*)temp;

}

}

else

{

m_memory[index] = temp->next;

return (char*)temp;

}

}

void mem_free(void* p,int size)

{

if(size > 128)

{

free(p);

return ;

}

obj* temp = (obj*)p;

int index = freelist_index(size);

temp->next = m_memory[index];

m_memory[index] = temp;

}

private:

enum {_ALIGN = 8};//

int freelist_index(int __bytes)

{

return (((__bytes) + (int)_ALIGN-1)/(size_t)_ALIGN - 1);

}

int round_up(int __bytes)

{

return (((__bytes) + (int) _ALIGN-1) & ~((int) _ALIGN - 1));

}

vector<union obj*> m_memory;

};

以上这篇实现一个内存池管理的类方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持快网idc。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 实现一个内存池管理的类方法 https://www.kuaiidc.com/74786.html

相关文章

发表评论
暂无评论