关于bitset和O2的一些疑惑
  • 板块学术版
  • 楼主IwannaAKIOI
  • 当前回复4
  • 已保存回复4
  • 发布时间2022/11/6 11:50
  • 上次更新2023/10/27 04:05:00
查看原帖
关于bitset和O2的一些疑惑
577481
IwannaAKIOI楼主2022/11/6 11:50

今天我写了一份代码,评测记录
众所周知任何问题都可以用O2解决,于是我又交了一遍
MLE的点开了O2过了?于是我把#25的数据下了下来,单独开了一道题测,顺便把空间开到了256MB,结果
可以发现我确实只是空间超了,并没有出现无限递归等可能导致MLE的bug
那为什么开了O2就能过呢?
突然想到我进行了一个bitset的用,于是把bitset改成了等价的bool数组,结果是这样的:单点以及原题
于是我又进行了如下测试:(编译选项:-std=c++14 -Wl,--stack=100000000,在我的电脑上进行)
先测试了如下代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e7+5;
mt19937 rnd(time(0));
bitset<N>bs;
//bool bs[N];
void dg(int d){
	if(!d){
		return;
	}
	bs[rnd()%N]=1;
	dg(d-1);
	bs[rnd()%N]=0;
}
signed main(){
	dg(1500000);
	return 0;
}

它在运行30s之后RE了,并且在运行期间如果点右上角的叉,会有5秒延迟才关闭(可以使用命令无延迟结束进程),但无论是CPU还是内存占用都几乎为0,本人孤陋寡闻不知道为什么。
开了O2是同样的结果。
于是换成bool数组再试一次:

#include<bits/stdc++.h>
using namespace std;
const int N=1e7+5;
mt19937 rnd(time(0));
//bitset<N>bs;
bool bs[N];
void dg(int d){
	if(!d){
		return;
	}
	bs[rnd()%N]=1;
	dg(d-1);
	bs[rnd()%N]=0;
}
signed main(){
	dg(1500000);
	return 0;
}

此代码在开不开O2的情况下,都能在0.22秒左右跑完。
所以发这个帖,希望知道三件事:

  1. 开O2为什么会降低bitset内存的占用
  2. 为什么bitset的内存占用在开了O2的情况下仍比bool数组高,但对bitset和bool进行sizeof的返回值,后者约是前者的8倍?
  3. 后面两段代码出现的情况的原因
2022/11/6 11:50
加载中...