我有C++代码,归结为如下所示:
class Foo{
bool bar;
bool baz;
Foo(const void*);
};
Foo::Foo(const void* ptr){
const struct my_struct* s = complex_method(ptr);
bar = calculate_bar(s);
baz = calculate_baz(s);
}
Run Code Online (Sandbox Code Playgroud)
从语义上讲,bar和baz成员变量应该是const,因为它们在初始化后不应该更改.但是,似乎为了使它们如此,我需要在初始化列表中初始化它们而不是分配它们.要清楚,我理解为什么我需要这样做.问题是,我似乎无法找到任何方法将代码转换为初始化列表而不执行以下不良操作之一:
complex_method两次电话(对性能不好)有没有办法让变量const同时避免这些不良情况?
我一直在尝试使用一个简单的分析器来测量学校服务器上某些C代码的效率,而且我遇到了一个奇怪的情况.在很短的时间(半秒)之后,处理器突然开始执行指令两倍的速度.我已经测试了几乎我能想到的每一个可能的原因(缓存,核心负载平衡,CPU频率因睡眠不足而改变),但一切看起来都很正常.
为了它的价值,我正在学校的Linux服务器上进行这项测试,所以有可能是一个我不知道的不寻常的配置,但是使用的处理器ID没有改变,并且(通过顶部)服务器是我测试时完全闲置.
测试代码:
#include <time.h>
#include <stdio.h>
#define MY_CLOCK CLOCK_MONOTONIC_RAW
// no difference if set to CLOCK_THREAD_CPUTIME_ID
typedef struct {
unsigned int tsc;
unsigned int proc;
} ans_t;
static ans_t rdtscp(void){
ans_t ans;
__asm__ __volatile__ ("rdtscp" : "=a"(ans.tsc), "=c"(ans.proc) : : "edx");
return ans;
}
static void nop(void){
__asm__ __volatile__ ("");
}
void test(){
for(int i=0; i<100000000; i++) nop();
}
int main(){
int c=10;
while(c-->0){
struct timespec tstart,tend;
ans_t start = rdtscp();
clock_gettime(MY_CLOCK,&tstart);
test();
ans_t end = rdtscp();
clock_gettime(MY_CLOCK,&tend);
unsigned …Run Code Online (Sandbox Code Playgroud)