sizeof 运算结果与编译系统有关

研究与实现相关的layout没多大意义

参考:有关c++中类的虚拟继承sizeof问题

class A{};
sizeof(A);问sizeof结果?

对空类运用sizoef operator,表达式结果是多少?不是0,空类中没有信息,但实例仍需要在内存中有一些信息,这样才能使用,类的内存布局由编译器决定,vs中占用1字节。如果空类中含有虚函数,在类的实例中会添加指向虚函数的指针,指针在32位机器上占用4bytes,64(x64编译模式)位占用8字节。int在c++标准中没有规定具体大小,所以在不同平台上 sizeof(int) 也会不同。

情况2:sizeof(string)的大小?

这与实现有关。vs下string有短字符串优化,string含有一个缓冲区。sizeof作用于类类型结果未定义,implemtation defined,既由实现定义的。

情况3:sizeof(strcut)的大小?

1 struct s
2 {
3     int a;
4     char c;
5     double d;
6 }

结果并不是int+char+double的大小和,因为memory alignment,按照struct alignment的对齐规则,实际需要的内存多。

情况4: malloc为类类型分配动态内存:

1 string *q = (string*)malloc(sizeof(string) * 5);
2 *q = "djd";

会发生运行错误。malloc只分配了内存,不会调用string的构造函数做初始化。语句2为什么不能完成初始化呢?推测原因是sizeof只求了vs下string类的内存布局大小,malloc没有为一个string分配属于它的内存空间——用于存字符串序列 。联想到allocator类分配的内存是未初始化的,如果不用construct()构造内存,无法使用。

1 allocator<string> alloc;
2 string *strp = alloc.allocate(10)
3 *strp = "djka";
4 alloc.construct(strp, ".jj");

语句3 error

时间: 2024-11-12 06:32:03

sizeof 运算结果与编译系统有关的相关文章

C++ sizeof的内存计算(1)

文章来自NoAlGo博客原创:C++ sizeof的内存计算(1) 内存控制是程序设计过程中非常关键的一环,C/C++中使用sizeof计算数据占用的内存大小是一个常见的手段,但是这个问题涉及到很多基础的编程细节,能够很好地反映一个程序员的基本功,成为了笔试面试常见的问题之一.这里总结了一些常见的问题,鉴于篇幅问题,分成两部分进行,这里主要介绍比较基础的第一部分. C++ sizeof的内存计算(1) C++ sizeof的内存计算(2) 一 sizeof定义 在C++中sizeof的使用方法看

C++ sizeof操作符的用法和strlen函数的区别

摘要:本人首先介绍了C++中sizeof操作符的用法和注意事项,其次对比了和strlen的区别和使用,方便大家在写代码的时候查阅,和面试.笔试的时候复习. 目录: sizeof的用法: sizeof和strlen的区别: sizeof的用法: sizeof 是一种单目操作符,而不是函数.sizeof以字节形式给出操作数的存储空间. 操作数可以是一个表达式或在括号内的类型名.操作数的存储空间由操作数的类型决定. char str[]="hello"; char str1[100]; ch

Sizeof的计算看内存分配

本文记录了有关sizeof的一些计算,主要有下面的四种情况:(如有错误,敬请留言) 使用sizeof()计算普通变量所占用的内存空间 sizeof计算类对象所占用空间的大小-用到了字节对齐 sixeof计算含有虚函数的类对象的空间大小 sizeof计算虚拟继承的类对象的空间大小 使用sizeof()计算普通变量所占用的内存空间 #include <iostream> #include <stdlib.h> using namespace std; //如果数组变量被传入函数中做si

sizeof()函数求各类型变量所占空间的方法

#include "stdafx.h" #include <iostream> using namespace std; void func(char str[100]) { cout<<sizeof(str)<<endl; } int main() { char str[100]; func(str); //str传入函数做参数,做sizeof运算时被当做指针 返回4 cout<<sizeof(str)<<endl; //返

C/C++刁钻问题各个击破之细说sizeof(转)

今天在编程的时候,简单地用下边的程序求vector容器内的元素个数: vector<int> vec; for (int i = 0; i < 100; i++) { vec.push_back(i); } int size = sizeof(vec) / sizeof(int); 程序的运行结果是size=4(sizeof(vec)=16,sizeof(int)=4)而不是size=100.这让我很惊讶,因此我又进行了下边的实验: vector<int> vec_int;

sizeof运算符

sizeof运算符返回一条表达式或一个类型名字所占的字节数.sizeof运算符满足右结合律,其所得的值是一个size_t类型的常量表达式.运算符的运算对象有两种形式: sizeof(type) sizeof expr 在第二种形式中,sizeof返回的是表达式结果类型的大小.与众不同的一点是,sizeof并不实际计算其运算对象的值: Sales_data data,*p; siizeof(Sales_data);   //存储Sales_data类型的对象所占的空间大小 sizeof data;

C语言数据类型和算数运算

一. 进制转换: 要熟悉各进制之间相互的转换 1. 二进制 (0, 1) 2. 八进制 (0-7) 3. 十进制 (0-9) 4.十六进制 (0-9, A-F) (1). 十进制转二进制: (31)10=(11111)2 方法: 31/2, 上15余1 15/2, 上7余1 7/2, 上3余1 3/2, 上1余1 最后将所有的余数从下往上排列组合, 开头数字为最后一次运算的商数. (2). 二进制转十进制: (10110011)2=(179)10 方法:  101 1 00 1 1 ↓  ↓↓

【原创】sizeof运算符总结

sizeof运算符返回一条表达式或一个类型名字的所占字节数,返回值为size_t的常量表达式,注意:sizeof右结合,且为编译时计算,而非运行时 两种形式:sizeof (type)和sizeof expression sizeof计算的永远是类型所占字节数,如果是数组则计算数组的长度乘以元素类型字节数:所以对于第二种形式,计算的是expression表达式结果的类型大小,而不是表达式的值 sizeof运算符不是实际求表达式的值,所以sizeof *p,即使p是无效指针,也是安全的,得到的是*

C++ Prime:sizeof运算符

sizeof运算符的结果部分地依赖于其作用的类型: 对char或者类型为char的表达式执行sizeof运算结果得1: 对引用类型执行sizeof运算得到被引用对象所占空间的大小: 对指针执行sizeof运算得到指针本身所占空间的大小: 对解引用指针执行sizeof运算得到指针指向的对象所占空间的大小,指针不需有效: 对数组执行sizeof运算得到整个数组所占空间的大小,等价于数组中所有的元素各执行一次sizeof运算并将所得结果求和: 对string对象或vector对象执行sizeof运算只