背景资料:
所述PIMPL成语(指针实现)是用于执行隐藏在其中一个公共类包装的结构或类,可以不在库的公共类是的一部分外部看到的技术.
这会隐藏来自库用户的内部实现细节和数据.
在实现这个习惯用法时,为什么要将公共方法放在pimpl类而不是公共类上,因为公共类方法实现会被编译到库中,而用户只有头文件?
为了说明,此代码将Purr()实现放在impl类上并将其包装起来.
为什么不直接在公共类上实现Purr?
// header file:
class Cat {
private:
class CatImpl; // Not defined here
CatImpl *cat_; // Handle
public:
Cat(); // Constructor
~Cat(); // Destructor
// Other operations...
Purr();
};
// CPP file:
#include "cat.h"
class Cat::CatImpl {
Purr();
... // The actual implementation can be anything
};
Cat::Cat() {
cat_ = new CatImpl;
}
Cat::~Cat() {
delete cat_;
}
Cat::Purr(){ cat_->Purr(); }
CatImpl::Purr(){
printf("purrrrrr");
}
Run Code Online (Sandbox Code Playgroud) 使具有多个参数的构造函数explicit具有任何(有用)效果吗?
例:
class A {
public:
explicit A( int b, int c ); // does explicit have any (useful) effect?
};
Run Code Online (Sandbox Code Playgroud) 我正在设计一个连接到一个或多个数据源流的系统,并对数据进行一些分析,而不是基于结果触发事件.在典型的多线程生产者/消费者设置中,我将有多个生产者线程将数据放入队列,并且多个消费者线程读取数据,并且消费者仅对最新数据点加上n个点感兴趣.如果慢速消费者无法跟上,生产者线程将不得不阻止,当然,当没有未经处理的更新时,消费者线程将被阻止.使用具有读取器/写入器锁的典型并发队列将很好地工作,但是进入的数据速率可能很大,因此我希望减少锁定开销,尤其是生产者的写入锁.我认为我需要一个循环无锁缓冲区.
现在有两个问题:
圆形无锁缓冲是答案吗?
如果是这样,在我自己推出之前,您是否知道任何符合我需求的公共实施?
任何指向实现循环无锁缓冲区的指针总是受欢迎的.
顺便说一句,在Linux上用C++做这件事.
一些额外的信息:
响应时间对我的系统至关重要.理想情况下,消费者线程会希望尽快看到任何更新,因为额外的1毫秒延迟可能会使系统失去价值,或者价值更低.
我倾向于的设计思想是一个半无锁的循环缓冲区,生产者线程尽可能快地将数据放入缓冲区,让我们调用缓冲区A的头部,除非缓冲区已满,否则A满足缓冲区Z的结束.消费者线程将各自保存两个指向循环缓冲区P和P n的指针,其中P是线程的本地缓冲区头,P n是P 之后的第n个项目.每个消费者线程将推进其P和P ñ一旦处理完当前P和缓冲器指针Z的端前进具有最慢P ñ.当P赶上A,这意味着没有更新的处理更新,消费者旋转并忙着等待A再次前进.如果消费者线程旋转太长时间,它可以进入休眠状态并等待条件变量,但我没关系消费者占用CPU周期等待更新,因为这不会增加我的延迟(我会有更多的CPU核心)比线程).想象一下,你有一个循环轨道,并且生产者正在一群消费者面前运行,关键是调整系统,使生产者通常比消费者领先一步,并且大部分操作都可以使用无锁技术完成.我理解获得正确实施的细节并不容易......好吧,非常难,这就是为什么我想在自己制作一些错误之前先从别人的错误中吸取教训.
假设我有一个基类和派生类:
class Base
{
public:
virtual void Do();
}
class Derived:Base
{
public:
virtual void Do();
}
int main()
{
Derived sth;
sth.Do(); // calls Derived::Do OK
sth.Base::Do(); // ERROR; not calls Based::Do
}
Run Code Online (Sandbox Code Playgroud)
如我所见,我希望通过Derived访问Base :: Do.我得到一个编译错误,因为"类Base不可访问"但是当我声明Derive as时
class Derived: public Base
Run Code Online (Sandbox Code Playgroud)
它工作正常.
我已经读过默认继承访问是公共的,那为什么我需要在这里显式声明公共继承?
这应该很简单,并显示我的SQL无知:
SQL> select max(1,2) from dual;
select max(1,2) from dual
*
ERROR at line 1:
ORA-00909: invalid number of arguments
Run Code Online (Sandbox Code Playgroud)
我知道max通常用于聚合.我可以在这里使用什么?
最后,我想使用类似的东西
select total/max(1,number_of_items) from xxx;
Run Code Online (Sandbox Code Playgroud)
其中number_of_items是一个整数,可以是0.我想在这种情况下也看到总数.
在C/C++,是否有一个固定的顺序来评估函数的参数?我的意思是,标准说什么?难道left-to-right还是right-to-left?我从书中得到了令人困惑的信息.
是否有必要function call使用stack only.什么是C/C++标准,说这个?
最近看了在dotnetpearls.com一个文章在这里说,静态构建函数需要性能比较命中的大量.
无法理解为什么?
我有以下InnoDB表:
+-----------+-----------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-----------+------+-----+-------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| doc_id | char(32) | NO | | NULL | |
| staff | char(18) | NO | | NULL | |
| timestamp | timestamp | NO | MUL | CURRENT_TIMESTAMP | |
+-----------+-----------+------+-----+-------------------+----------------+
Run Code Online (Sandbox Code Playgroud)
使用这些键:
+--------------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality …Run Code Online (Sandbox Code Playgroud) 在阅读了大量的C++文章和教程后,我经常看到"C++ 不是 C!" 这句话.或某些变体.如果这是真的,为什么C++试图与C兼容?当然这只是鼓励C程序员编写糟糕的C++代码?我只是这个领域的新手,所以我可以随意轰炸我,理由是我错误地认为C++应该让它成为思想并忘记C. Ell.
我正在使用cygwin中的gcc编写一个C程序.我的问题是,你如何创建一个makefile?我的意思是,它有什么文件扩展名?我知道如何编写简单的规则,但我无法在文本编辑器中使用正确的扩展名保存文件?无法找到关于此的任何信息...这是一个超级新手问题.所以让火焰开始吧.:-P
c++ ×6
c ×3
sql ×2
.net ×1
algorithm ×1
c# ×1
concurrency ×1
constructor ×1
inheritance ×1
insert ×1
lock-free ×1
makefile ×1
max ×1
mysql ×1
oop ×1
oracle ×1
performance ×1
pimpl-idiom ×1
static ×1