我试图理解使用内存池进行内存管理,但我找不到太多关于它的内容,尽管它似乎是一种非常常见的机制.
我所知道的就是每个维基百科的 "内存池,也称为固定大小的块分配" ,我可以使用这些块为我的对象分配内存.
有关内存池的标准规范吗?
我想知道它在堆上是如何工作的,它是如何实现的,以及如何使用它?
如果你还没有,请熟悉Boost.Pool.从Boost文档中:
什么是游泳池?
池分配是一种非常快速的内存分配方案,但其使用受到限制.有关池分配更多的信息(也称为简单的分隔式,看概念概念和简单的分隔式.
我可以理解他的意思,但这并不能帮助我理解如何使用它们以及内存池如何帮助我的应用程序,如何实际使用它们.
将会欣赏一个显示如何使用内存池的简单示例.
我不明白为什么没有optional tuple,我的意思是,就像这样; optional<int,string,char>这会结合一个optional int,optional string和optional char.
您可以将其视为优化的 std::tuple<boost::optional<T>...>
其中booleans使用的optionals是一起在该月底structure以收拾它,甚至更好,可以存储在一个bitset.
这可能会减少结构A LOT的内存,而且更优雅:
std::tuple<boost::optional<int>,boost::optional<string>,boost::optional<char>>
VS
optional<int,string,char>
我能想到的这样做的方式,使用的implementaion boost::optional和variadic templates,而是开始在此之前,我想知道这是否是一个好主意,这将是实现这个更好的办法,有什么困难,我会面对?
编辑:
基本上我为什么不喜欢 std::tuple<boost::optional<T>...>;
因为一个optional<T>是工会T和bool:

新结构可以节省大量内存!
我知道这个C++类的一个实例:
class A {
char c;
int iiii;
short ss;
};
Run Code Online (Sandbox Code Playgroud)
在内存中看起来有点像这样: c| | | |i|i|i|i|s|s| | |
这个4/2字母注释没有任何意义(但我认为我的观点很明确)
1 byte for char,3 bytes of padding,4 bytes of int,2 bytes for the short,和2 bytes of tail padding (依赖于平台的,但它不会改变逻辑)
从C++标准(编译器不会改变我的例子中的字段的顺序):
分配具有相同访问控制(第11条)的(非联合)类的非静态数据成员,以便后面的成员在类对象中具有更高的地址.具有不同访问控制的非静态数据成员的分配顺序未指定(第11条).实施对齐要求可能导致两个相邻成员不能立即分配; 因此,可能需要空间来管理虚拟功能(10.3)和虚拟基类(10.1).
所以,我想知道Java类是否相同,编译器是否可以更改顺序以减少填充?
在MouseReleaseEvent(QMouseEvent *e),有没有办法知道哪个按钮是在不使用新变量的情况下发布的?我的意思是像MousePressEvent(QMouseEvent *e)在一起e.buttons().我e.buttons()在releaseEvent中尝试过它不起作用(这是合乎逻辑的).
我刚刚了解了填充,我试图对其进行一些测试,我尝试打包这个结构:
struct B {
int a,b,c;
string s;
char x;
string t;
char y;
string u;
}__attribute__((packed)) ;
Run Code Online (Sandbox Code Playgroud)
但我收到这个警告:
warning: ignoring packed attribute because of unpacked non-POD field 'std::string B::u'
string u;
Run Code Online (Sandbox Code Playgroud)
这是否意味着包含的结构strings不能被打包?还有其他方法吗?如果是的话,会影响性能吗?
这不是这个 问题的重复,我读了答案,我仍然对这个问题有一些疑问.
我测试了一些像这样的类:
class A {
private:
int b;
public:
char c;
int a;
private:
char e;
};
Run Code Online (Sandbox Code Playgroud)
而且我已经看到这些字段存储就像没有访问说明符一样,这没有错,因为:
N3376(C++ 11草案的第一篇文章)9.2 [class.mem]/13:
分配具有相同访问控制(第11条)的(非联合)类的非静态数据成员,以便后面的成员在类对象中具有更高的地址.具有不同访问控制的非静态数据成员的分配顺序是未指定的.实施对齐要求可能导致两个相邻成员不能立即分配; 因此,可能需要空间来管理虚拟功能(10.3)和虚拟基类(10.1).
我仍然不明白的是:
具有不同访问控制的非静态数据成员的分配顺序是未指定的.
什么是未指明的意思,GCC肯定有办法做到这一点,他们不只是随机做我猜...他们不希望用户知道它?或者有很多方法可能取决于选项?
因为我试过的所有例子,我都有与我文件中声明的相同的顺序(+填充)
我正在使用gcc 4.9.2,有谁知道GCC是否指定了这样做的方式?
我需要知道这一点,因为我正在创建一个程序来计算所有字段之间的填充,该程序适用于目前没有访问说明符的结构.当有不同的可访问性块时,我将不得不找到一种方法
我有一个进程在后台运行,一个 python 进程,ps -ef我可以从运行命令中看到文件名:UID PID PPID ... python ./filename.py
我怎样才能知道文件所在的位置
我将当前 GMT 时间写为字符串,如下所示:
const std::time_t now = std::time(nullptr);
std::stringstream ss;
ss << std::put_time(std::gmtime(&now), "%Y-%m-%d %H:%M:%S");
Run Code Online (Sandbox Code Playgroud)
稍后我想做相反的操作,从字符串流中读取 GMT 时间,并将其与当前时间戳进行比较:
std::tm tm = {};
ssTimestamp >> std::get_time(&tm, "%Y-%m-%d %H:%M:%S");
const std::time_t&& time = std::mktime(&tm);
const double timestampDiff((std::difftime(std::time(nullptr), time)));
Run Code Online (Sandbox Code Playgroud)
下面的代码中缺少一些内容,因为解码的时间从未转换为 GMT,因此由于我的本地时区,我最终得到 1 小时的时差
PS: 只能使用标准库,并且不能更改日期字符串格式