我是cpp新手(来自Java)。我正在写一个cpp应用程序。该应用程序的性能至关重要。我寻找了一个日志框架,并 在上面链接的末尾找到了log4cxx ,其中有性能部分解释:
当完全关闭日志记录或仅关闭一组级别的日志记录时,日志请求的成本包括方法调用加上整数比较
我记得在大学时代,我们使用 with#ifndf来包装伐木。
问题:
使用包装日志记录#ifndf仍然是标准做法吗?
是否有类似下面的伪代码?
logger.Log_Debug(() => { "My complicated log message " + thisFunctionTakesALongTime() + " will take no time" });
Run Code Online (Sandbox Code Playgroud) 你有以下几点:
Person& getPersonByName(string name);
Run Code Online (Sandbox Code Playgroud)
在什么情况下你需要担心一旦方法结束就会破坏getPersonByName中的返回者,这样调用者方法就可以处理被破坏的数据?
谢谢
我需要保存数据包状态一段时间.所以我读取了表示为unsigned char*的数据包数据,而不是用这个数据创建一个记录,并将记录保存在列表中一段时间.
这将是更好的方式将记录中的数据包表示为char*或char [].
如何将读取数据(unsigned char )复制到两个选项:unsigned char []和unsigned char*
我需要复制数据,因为每次我读取数据包时都会被重新加入相同的char*,所以当我保存一段时间后我需要先复制数据
多线程环境.Foo的内容可以是多线程的.
class Foo
{
public:
const A & getA() {return a_;} //has guard
void setA(A newA){a_ = newA;} //has guard
private:
A a_;
};
Run Code Online (Sandbox Code Playgroud)
呼叫者:
A a = foo.getA();
Run Code Online (Sandbox Code Playgroud)
另一个问题,我问有人告诉我, 如果你返回const&它保证变量的生命时间将延长到参考的生命周期 ,所以根据这个我不需要复制值,我安全即使调用setA on foo在我打电话给getA之后就完成了,但是反对它的很多争论都被araised了,所以我觉得这不正确.
我想保持安全,所以我将签名更改为:
A & getA() {return a_;}
Run Code Online (Sandbox Code Playgroud)
但是编译器仍然警告我已经引用了局部变量.我不明白为什么,因为据我所知(cpp新手),返回值是foo.a的副本,那么问题是什么呢?
我并不担心改变a_内容.(_ a.age = 4).我担心呼叫设置,呼叫者中的'a'将是非法的
我有一个课堂
char chars[4]
Run Code Online (Sandbox Code Playgroud)
我想在构造函数中初始化此字段.
我的构造函数需要char chars[]作为参数获取,并且在构造函数调用中我想要初始化我的类字段.
我可以这样做,还是需要打电话给副本?
我需要根据分钟间隔监控内部流量,所以我决定做这样的事情:
Flow{
void send();
static uint accumulator;
}
//Only single thread call to send
void Flow::sendPacket(pck){
accumulator+=pck.size();
do();
}
//Only single thread call to monitor . **No the same thread that call to send!**
Monitor::monitor(){
//Start monitor
Flow::accumulator = 0;
sleep(60);
rate = accumulator/60;
}
Run Code Online (Sandbox Code Playgroud)
我可以在没有使用原子的情况下初始化为0的风险不会发生吗?
我担心的是,即使是原子也不会保证init,因为如果同时监视init为0并且同时使用旧值进行累积,则新累积值将基于旧值而不是init值.
另外我关注原子惩罚.每个数据包都会调用send.
>>> pkt = sniff(count=2,filter="tcp")
>>> raw = pkt[1].sprintf('%Padding.load%')
>>> raw
"'\\x04\\x00\\x00\\x00\\x00\\x00\\x00\\x00g\\xc4|\\x00\\x00\\x00\\x00\\x00'"
>>> print raw
'\x04\x00\x00\x00\x00\x00\x00\x00g\xc4|\x00\x00\x00\x00\x00'
Run Code Online (Sandbox Code Playgroud)
使用打印时的原始产量不同输出
我需要一个小柜台(最多10个).
我不想使用原子(因为原子的开销).
我可以使用哪种类型?
我可能会过早优化,但不幸的是我现在无法模拟完整的生产环境(多线程环境).
在Ubuntu x86上运行