请不要测试直接回答 echo "a" > a.txt 该文件大小多少字节?

2017-06-22 12:29:31 +08:00
 nikoo
感觉有点意外,两个问题:
1、这是为什么?
2、这合理吗?
6686 次点击
所在节点    问与答
75 条回复
hsmocc
2017-06-22 17:17:53 +08:00
不懂 lp64 之类的、感觉 c 不是强类型的语言所以编译器把'a' 当作 int 处理,而 c++这种强类型的是 char 就是 char
wwqgtxx
2017-06-22 17:18:15 +08:00
@0asis
const char *c = "a";
std::cout<<sizeof(c)<<std::endl;
std::cout<<sizeof("a")<<std::endl;

>8
>2

个人觉得这个地方应该是编译器直接求值了
canfoderiskii
2017-06-22 17:28:41 +08:00
@0asis sizeof 用于字面字符串相当于用于编译期确定长度的数组
tghgffdgd
2017-06-22 17:46:30 +08:00
虽然认为是 2 个字节,但是实际上可以 2 个字节,也可以 7 个字节,也可以 8 个字节,跟环境有关系啊
canfoderiskii
2017-06-22 17:49:06 +08:00
@jigloo 查了 c11 标准,标准里面并没有直接提到 sizeof 用于字面字符串的情形。
对于字面字符串,标准 6.4.5 string literal 一节里面有这么一句: The multibyte character sequence is then used to initialize an array of static storage duration and length just sufficient to contain the sequence. For character string literals, the array elements have type char, and are initialized with the individual bytes of the multibyte character sequence.

所以我认为,字面字符串的类型是数组,sizeof 返回值就是数组长度
lululau
2017-06-22 17:52:59 +08:00
mkdir tmp
cd tmp
rm -rf *
echo > a
echo > b

command ls -l | wc -l # => 答案是几?
veelog
2017-06-22 19:10:52 +08:00
char s[]="A";
sizeof("A") == sizeof(s)
veelog
2017-06-22 19:11:45 +08:00
echo -n "" >a.txt
bumz
2017-06-22 19:28:54 +08:00
@canfoderiskii #45 不对的。数组长度是 sizeof(array) / sizeof(array[0])。只是由于 sizeof(char) 是 1,分母就没了。
bumz
2017-06-22 19:35:01 +08:00
@jigloo #5 char 'A' 会被自动变成 int,因此前者是 4 字节; string literal "A" 是 {'A', '\0'} 的语法糖,占用两字节,因此后者是 2 字节。

相关知识点:char 型的值会自动变 int 型的值,因此 char literal 直接是一个 int,以免多余的类型转换; string literal 是数组的语法糖; sizeof(数组)/sizeof(数组第一个元素)。
bumz
2017-06-22 19:35:16 +08:00
数组长度 = sizeof(数组)/sizeof(数组第一个元素)。
ldbC5uTBj11yaeh5
2017-06-22 19:37:45 +08:00
@bumz 大兄弟,还是那句话,回帖要看帖。
menc
2017-06-22 20:08:14 +08:00
这个帖子贼厉害,一个帖子下面讨论两个不同的话题且互不干涉,堪称精分现场典范。
huluhulu
2017-06-22 21:35:01 +08:00
文件大小=磁盘一簇的大小,NTFS 或者 fat32 默认是 4k
你也可以更大
mozutaba
2017-06-22 21:44:05 +08:00
取决于文件簇
kingddc314
2017-06-22 22:27:29 +08:00
前面两个黑白头像,还以为网有问题
canfoderiskii
2017-06-22 23:05:27 +08:00
@bumz 我表述问题而已。sizeof 数组就是数组字节长度
mingyun
2017-06-22 23:19:21 +08:00
想起了那个命令行生成 md5 不同的问题,就是因为换行
extreme
2017-06-22 23:49:52 +08:00
@wwqgtxx You are right

// sizeof.cpp
#include <iostream>

void printSizeof() {
int sizeofValue = sizeof("a");
// std::cout<<sizeofValue<<std::endl;
}

bash - :~ # g++ -c -O0 sizeof.cpp
bash - :~ # objdump -S sizeof.o | less
...
0000000000000000 <_Z11printSizeofv>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 48 83 ec 10 sub $0x10,%rsp # 给 int a 分配储存空间,0x10 大概是为了对齐
8: c7 45 fc 02 00 00 00 movl $0x2,-0x4(%rbp) # 把值 0x2 存入变量 a 中
f: 90 nop
10: 48 83 c4 10 add $0x10,%rsp
14: 5d pop %rbp
15: c3 retq
...
msg7086
2017-06-23 00:56:41 +08:00
@huluhulu 那不是文件大小,那是文件占用大小。
文件也不一定要占用整个簇,比如小文件就可以直接储存在 MFT 表项中而不用另开一簇。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/370278

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX