关于属性,#pragma,位域与压缩空间
  • 板块学术版
  • 楼主konyakest
  • 当前回复9
  • 已保存回复9
  • 发布时间2024/10/3 00:06
  • 上次更新2024/10/3 10:38:24
查看原帖
关于属性,#pragma,位域与压缩空间
482660
konyakest楼主2024/10/3 00:06

NOI 系列竞赛明确禁止使用 #pragma 指令

一些 OJ 都对此做出了限制,比如 luogu 无法交含有 #pragma GCC optimize(2) 语句的代码

今天,有一道题,它很卡空间,我想到使用位域来压缩空间。我定义了这样一个结构体:

struct DATA{
	__int128 dp:86;
	long long s:56;
	long long las:56;
}q[(int)4e7+5];

理论上,这个结构体可以只占用 25Byte25\text{Byte},这样刚好卡进 1024MB1024\text{MB} 的限制

但是,由于内存对齐规则,它占用了 32Byte32\text{Byte},于是导致了 MLE

我想到使用 #pragma pack(1) 指令来强制其占用 25Byte25\text{Byte},发现各大 OJ 并没有限制含有这个语句的提交

我又查看 gnu 文档,发现 gnu 有一个属性 [[gnu::packed]],可以达到同样的效果,同样没有被各大 OJ 禁止

struct [[gnu::packed]] DATA{
	__int128 dp:86;
	long long s:56;
	long long las:56;
}q[(int)4e7+5];

那么,就算 NOI 系列比赛明确禁止 #pragma,可以使用这个属性吗?

其他 gnu 扩展属性可以使用吗?(甚至有开O3的属性)

顺便问一句,遇到这种情况,怎样手动实现一个位域能够比较高效?

2024/10/3 00:06
加载中...