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];
理论上,这个结构体可以只占用 25Byte,这样刚好卡进 1024MB 的限制
但是,由于内存对齐规则,它占用了 32Byte,于是导致了 MLE
我想到使用 #pragma pack(1) 指令来强制其占用 25Byte,发现各大 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的属性)
顺便问一句,遇到这种情况,怎样手动实现一个位域能够比较高效?