Archive for the ‘C/C++’ Category

sizeof

sizeof百度百科
sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用。
C99标准规定,函数(不能求一个返回类型为void的函数的sizeof值)、不能确定类型的表达式以及位域成员不能被计算sizeof值。
让宽度为2的基本数据类型(short等)都位于能被2整除的地址上,让宽度为4的基本数据类型(int等)都位于能被4整除的地址上,以此类推。
字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。

About size_t and ptrdiff_t

size_t和ptrdiff_t都与机器和平台有关。

size_t的基础是无符号整型,但是它能存储理论上数组的最大值。在32位系统上它是32位的,在64位系统上它是64位的,因此一个size_t类型的变量能够安全的存储一个指针。size_t类型的最大值是常量SIZE_MAX。

ptrdiff_t的基础是有符号整型,但是它能存储理论上数组的最大值。在32位系统上它是32位的,在64位系统上它是64位的,因此一个ptrdiff_t类型的变量能够安全的存储一个指针。ptrdiff_t类型还是两个指针(地址)相减的返回值类型。

详细请见:

http://blog.163.com/lgy-047/blog/static/61346565200910921449408/

new operator, operator new and placement new

new operator由C++语言定义,分配空间(调用operator new),构造对象(调用placement new)。详细请见:

http://www.cnblogs.com/swpattern/archive/2010/05/11/1732352.html

模板特化

模板特化分为全特化和偏特化。详细请见:

http://hi.baidu.com/klcdyx2008/blog/item/5adbf77b79f316f90bd1873c.html

更改:文中说“但是不幸的是,模板的偏特化机制不能用在函数身上,不论成员函数还是非成员函数.”应该是不对的,SGI STL中的__uninitialized_copy_aux、__uninitialized_fill_aux、__uninitialized_fill_n_aux三个函数都使用到了模版的偏特化。

Lex Version0.4 class Heap

Lex Version0.4到此为止已经完成了编译原理的实验,实现了从词法分析到语法分析再到语义分析生成三地址码的过程。

class Heap部分根据语义分析生成三地址码的需要进行了部分修改。全部代码稍后放出。

#ifndef _HEAP_H_
#define _HEAP_H_
class Heap {
private:
 int syn[100];//存储词法分析后的符号表种别码
 char token[100][10];//存储词法分析后的符号表词素
 int head, tail;//游标,head表示当前使用的位置,tail表示当前可用的第一个位置。
public:
 Heap();
 ~Heap();
 int first();//head=0并返回该syn。-1表示失败。
 int prev();//head前移并返回该syn。-1表示失败。
 int next();//head后移并返回该syn。-1表示失败。
 bool append(int, char*);//加入syn和token
 char* getToken();//获得当前词素
};
#endif

#include "StdAfx.h"
#include "Heap.h"
#include <string.h>

Heap::Heap()
{
 for(int i = 0; i < 100; i++)
  syn[i] = -1;
 memset(token, 0, sizeof(token));
 head = tail = 0;
}

Heap::~Heap()
{

}

int Heap::first()
{
 head = 0;
 return syn[head];
}

int Heap::prev()
{
 if(head == 0)
  return -1;
 return syn[--head];
}

int Heap::next()
{
 if(head == tail - 1)
  return -1;
 return syn[++head];
}

bool Heap::append(int tempsyn, char* temptoken)
{
 if(tail >= 100)
  return false;
 syn[tail] = tempsyn;
 strcpy(token[tail++], temptoken);
 return true;
}

char* Heap::getToken()
{
 return token[head];
}

无觅相关文章插件,快速提升流量