之前网上一直有这么一条for循环优化建议: 将size提到第一个分号前,这样可以提高循环的效率,例如: std::vector<int> aaa; for (size_t i = 0, size = aaa.size(); i < size; i++) { printf("bbb"); } 这个如果是很多年前,应该是有道理的,但是现在的编译器足够聪明,很多看起不够优化的代码,编译器会帮你处理。 以下是在VS2015下的汇编代码,结果是:size不前提反而可以节省两次mov指令。 size放在第一个分号后: for (size_t i = 0; i < aaa.size(); i++) 00007FF7629E3147 mov qword ptr [rbp+48h],0 00007FF7629E314F jmp _20161011+3Ch (07FF7629E315Ch) 00007FF7629E3151 mov rax,qword ptr [rbp+48h] 00007FF7629E3155 inc rax 00007FF7629E3158 mov qword ptr [rbp+48h],rax 00007FF7629E315C lea rcx,[aaa] 00007FF7629E3160 call std::vector<int,std::allocator<int> >::size (07FF7629E16BDh) 00007FF7629E3165 cmp qword ptr [rbp+48h],rax 00007FF7629E3169 jae _20161011+59h (07FF7629E3179h) size提到第一个分号前:

Continue reading

原文:http://ju.outofmemory.cn/entry/149128 struct A { int x:1; int y:2; int z:31; }; 此时是正确的 但是: struct A { int x:1; int y:2; int z:33; }; 此时就会有编译错误:error C2034: 'z' : type of bit field too small for number of bits 原文:http://zhidao.baidu.com/question/60696610.html struct/class定义中在成员后面加冒号“:1”是什么意思? 这是位域操作的表示方法,也就是说后面加上“:1”的意思是这个成员的大小占所定义类型的1 bit,“:2”占2 bit,依次类推。当然大小不能超过所定义类型包含的总bit数。 一个bytes(字节)是8 bit(bit)。例如你的结构中定义的类型是u_char,一个字节,共8bit,最大就不能超过8。 32位机下, short是2字节,共16bit,最大就不能超过16. int是4字节,共32bit,最大就不能超过32. 依次类推。 这样定义比较省空间。例如你上面的结构,定义的变量类型是u_char,是一字节类型,即8bit。 fc_subtype占了4bit,fc_type占2bit,fc_protocol_version占2bit,共8bit,正好是一个字节。 其他八个成员,各占1bit,共8bit,正好也是一个字节。 因此你的结构的大小如果用sizeof(struct frame_control)计算,就是2bytes.

Continue reading

代码: std::string str("笑傲江湖DA"); int Len = str.size(); char* data = new char[Len](); strcpy(data, str.data()); HProtocol::test t1; t1.set_input_str(data); char* buff[1024]; t1.SerializeToArray(buff, 1024); HProtocol::test t2; t2.ParseFromArray(buff, t1.ByteSize()); //最终str3的值依然是str的值 const char* str3 = t2.input_str().data();

Continue reading

关键字:C++数组初始化 原文: http://www.cnblogs.com/mywebname/articles/2291540.html 定义: int *pia = new int[10]; // array of 10 uninitialized ints 此 new 表达式分配了一个含有 10 个 int 型元素的数组,并返回指向该数组第一个元素的指针,此返回值初始化了指针 pia。 在自由存储区中创建的数组对象是没有名字的,只能通过其地址间接地访问堆中的对象。 注意:C++使用new和delete在堆(自由存储区)上分配和释放动态数组。 动态数组初始化: 1.元素只能初始化为元素类型的默认值,而不能像数组变量一样,用初始化列表为数组元素提供各不相同的初值。 2.对于内置数据类型元素的数组,必须使用()来显示指定程序执行初始化操作,否则程序不执行初始化操作: int *pia = new int[10]; // 每个元素都没有初始化 int *pia2 = new int[10] (); // 每个元素初始化为0 3.类类型元素的数组,则无论是否使用(),都会自动调用其默认构造函数来初始化: string *psa = new string[10]; // 每个元素调用默认构造函数初始化 string *psa = new string[10](); // 每个元素调用默认构造函数初始化 动态分配空数组: char *cp = new char[0]; 之后,可以动态改变cp的维数。

Continue reading

使用std::reverse函数: #include <vector> #include <iostream> #include <iterator> #include <algorithm> int main() { std::vector<int> v({1,2,3}); std::reverse(std::begin(v), std::end(v)); std::cout << v[0] << v[1] << v[2] << '\n'; int a[] = {4, 5, 6, 7}; std::reverse(std::begin(a), std::end(a)); std::cout << a[0] << a[1] << a[2] << a[3] << '\n'; }

Continue reading

示例代码: struct TestStru { int val; TestStru() { val = -1; } }; std::vector<TestStru> TestArr; TestStru e1; TestArr.push_back(e1); TestStru& e = TestArr[0]; e.val = 999; TestStru e2; TestArr.push_back(e2); 变量e为数组TestArr内元素的引用,但是当执行TestArr.push_back(e2);时,e就失效了。原因是push_back的时候内部容器有扩容,另外vector的默认容量为0。

Continue reading

keywords:C++, new, placement new 原文: http://stackoverflow.com/questions/4956249/using-malloc-instead-of-new-and-calling-the-copy-constructor-when-the-object-is You’ll need to use placement new after getting the raw memory from malloc. void* mem = malloc(sizeof(S)); S* s = new (mem) S(); //this is the so called "placement new" When you’re done with the object you have to make sure to explicitly call its destructor. s->~S(); free(mem);

Continue reading

Author's picture

Neil Wang

久长唯有品格

To Be Marvelous

Yichang·Hubei