共享内存由于是多进程共享的,里面的数据不适合包含指针,因为共享内存在不同进程里的地址并不相同。尽管可以在连接共享内存时指定连接地址,但是,这样做限制太多:
- 不同硬件、系统这个地址可能不一样,没有通用性
- 动态挂载、卸载不能保证地址可用,从而只能在进程加载时尽早连接共享内存
- 不同的使用共享内存的组件存在冲突可能,导致地址不可用
因此坚持由系统分配连接地址是合理的。这样,就要求共享内存里的数据不包含指针,通常我们都选择只使用简单结构,但是即使是简单结构,我们也可以尽量包装一下,方便使用。
这里就是一个字符串的模板sstring<int>,用来替代sstring。设计思想很简单,就是个定长数组,提供类似string的操作。
这个代码在sstring后面还包含了两个运算符重载,用来支持>>和<<。
代码是用于unix/linux的。
cpp
#include <cstring>
#include <string>
//定长字符数组模板,共享内存不能用string,char[]又不安全
template <long BUFSIZE >
class sstring
{
private:
char data[BUFSIZE];
static void _copydata(char * buf, char const * source)
{
buf[BUFSIZE - 1] = '\0';
long i = 0;
for (; i < BUFSIZE - 1; ++i)
{
buf[i] = source[i];
if ('\0' == source[i])break;
}
for (; i < BUFSIZE - 1; ++i)
{
buf[i] = '\0';
}
}
public:
sstring() { memset(data, 0, BUFSIZE); }
~sstring() { memset(data, 0, BUFSIZE); }
sstring(sstring const & tmp) { _copydata(data, tmp.data); }
sstring(char const * psz) { _copydata(data, psz); }
sstring(std::string const & str) { _copydata(data, str.c_str()); }
sstring & operator=(sstring const & tmp) { _copydata(data, tmp.data); return *this; }
sstring & operator=(char const * psz) { _copydata(data, psz); return *this; }
sstring & operator=(std::string const & tmp) { _copydata(data, tmp.c_str()); return *this; }
long size()const { return strlen(data); }
char const * c_str()const { return data; }
char const & operator [](long off)const { return data[off]; }
bool operator == (char const * tmp)const { return 0 == strcmp(data, tmp); }
bool operator == (sstring const & tmp)const { return 0 == strcmp(data, tmp.data); }
bool operator == (std::string const & tmp)const { return 0 == strcmp(data, tmp.c_str()); }
bool operator != (char const * tmp)const { return 0 != strcmp(data, tmp); }
bool operator != (sstring const & tmp)const { return 0 != strcmp(data, tmp.data); }
bool operator != (std::string const & tmp)const { return 0 != strcmp(data, tmp.c_str()); }
bool operator < (char const * tmp)const { return 0 > strcmp(data, tmp); }
bool operator < (sstring const & tmp)const { return 0 > strcmp(data, tmp.data); }
bool operator < (std::string const & tmp)const { return 0 > strcmp(data, tmp.c_str()); }
bool operator <= (char const * tmp)const { return 0 >= strcmp(data, tmp); }
bool operator <= (sstring const & tmp)const { return 0 >= strcmp(data, tmp.data); }
bool operator <= (std::string const & tmp)const { return 0 >= strcmp(data, tmp.c_str()); }
bool operator > (char const * tmp)const { return 0 < strcmp(data, tmp); }
bool operator > (sstring const & tmp)const { return 0 < strcmp(data, tmp.data); }
bool operator > (std::string const & tmp)const { return 0 < strcmp(data, tmp.c_str()); }
bool operator >= (char const * tmp)const { return 0 <= strcmp(data, tmp); }
bool operator >= (sstring const & tmp)const { return 0 <= strcmp(data, tmp.data); }
bool operator >= (std::string const & tmp)const { return 0 <= strcmp(data, tmp.c_str()); }
};
template <long BUFSIZE >
inline std::ostream& operator <<(std::ostream & out, sstring<BUFSIZE> const & data)
{
out << data.c_str();
return out;
}
template <long BUFSIZE >
inline std::istream & operator >>(std::istream & in, sstring<BUFSIZE> & data)
{
std::string tmp;
in >> tmp;
data = tmp;
return in;
}
这个代码在我的共享内存体系里是个基础对象,广泛使用。
(这里是结束)