64,670
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
using namespace std;
#define sizeof_v(v) (int)((char*)(&v+1) - (char*)(&v))//
#define sizeof_t(t) (int)((t*)0 + 1) //这两行是什么意思?
#define ALIGN(v,b) (v+b-1)&(~(b-1))
class Empty
{
};
void main()
{
Empty e;
cout<<sizeof(Empty)<<endl;
cout<<sizeof_t(Empty)<<endl;
cout<<sizeof_v(e)<<endl;
}
#include <iostream>
#include <cstdlib>
template<typename _T>
void print_memory(const _T& __v)
{
for(int i=0;i<sizeof(_T);++i)
{
std::cout.width(2);
std::cout.fill('0');
std::cout <<std::hex << static_cast<unsigned int>(reinterpret_cast<const unsigned char*>(&__v)[i]) << ' ';
}
}
struct foo
{
typedef void (foo::*pointer_mem_fun)();//这句是什么意思?
virtual void vhello()
{
std::cout<<"virtual hello world\n";
}
void hello()
{
std::cout<<"hello world\n";
}
virtual void vhello2()
{
std::cout<<"virtual hello world 2\n";
}
void hello2()
{
std::cout<<"hello world 2\n";
}
virtual void vhello3()
{
std::cout<<"virtual hello world 3\n";
}
void hello3()
{
std::cout<<"hello world 3\n";
}
};
void call(foo::pointer_mem_fun p)
{
print_memory(p);
(foo().*p)();
}
void main()
{
call(&foo::hello);//怎么会调用到hello()函数??通过函数的地址?
call(&foo::hello2);
call(&foo::hello3);
call(&foo::vhello);
call(&foo::vhello2);
call(&foo::vhello3);
}
#define sizeof_v(v) (int)((char*)(&v+1) - (char*)(&v))
#define sizeof_t(t) (int)((t*)0 + 1)
第一个v代表一个变量,第二个t代表一个类型,两者均可以计算出这种类型占用多少字节,相当于sizeof().
typedef void (foo::*pointer_mem_fun)();
意思是poninter_mem_fun是一个函数指针,指向foo类里的一个函数,返回值是void,形参是空.
call(&foo::hello);//怎么会调用到hello()函数??通过函数的地址?
typedef void (foo::*pointer_mem_fun)();//这句是什么意思?
//我稍微修改了下,注意宏定义不能吝啬用小括号,另外因标准中sizeof的结果是size_t类型(unsigned int), 这里也修改为size_t
#define sizeof_v(v) ((size_t)((char*)(&v+1) - (char*)(&v))) //等于sizeof(v)
#define sizeof_t(t) ((size_t)((t*)0 + 1)) //等于sizeof(t)