C++重点笔记

来源:互联网 发布:linux pid kill 编辑:程序博客网 时间:2024/04/28 17:45

我最近在应聘时遇到了面试官提出的一些C++问题,很多没答准确。现在记录下来,慢慢积累,希望以后也能够温故而知新。

#pragma once与 #ifndef的优缺点对比

为了避免同一个文件被include多次
1   #ifndef方式(#include 防范,有时被称作宏防范)
2   #pragma once方式

 在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别。
    方式一:

  #ifndef __SOMEFILE_H__
    #define __SOMEFILE_H__
    ... ... // 一些声明语句
    #endif

  方式二:

  #pragma once
    ... ... // 一些声明语句

 

#ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。当然,缺点就是如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况。

#pragma once则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处 是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名碰撞引发的“找不到声明”的问题,重复包含更容易被发现并修正

方式一由语言支持所以移植性好,方式二可以避免名字冲突。

堆和栈的区别

一、预备知识—程序的内存分配
一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 
4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
二、例子程序 
这是一个前辈写的,非常详细 

//main.cppint a = 0; // 全局初始化区char *p1; // 全局未初始化区main(){    int b; // 栈    char s[] = "abc"; // 栈    char *p2; // 栈    char *p3 = "123456"; //123456\0在常量区,p3在栈上。    static int c =0; // 全局(静态)初始化区    p1 = (char *)malloc(10);    p2 = (char *)malloc(20); // 分配得来得10和20字节的区域就在堆区。    strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。}

参考:

#pragma once与 #ifndef的优缺点对比 http://eyuanhermit.blog.hexun.com/27995908_d.html

堆和栈的区别 http://eyuanhermit.blog.hexun.com/29128854_d.html


0 0