错误、漏洞、问题 - 页 2503 1...249624972498249925002501250225032504250525062507250825092510...3184 新评论 [删除] 2019.07.08 09:53 #25021 Alexey Viktorov: 那么,什么是错误呢? 你声明一个两个元素的数组,每个元素有两个字节,得到的是4个字节,应该是这样的。虫子在哪里?它是什么? 是这样的。 你对准4个和2个元素将占据2*8字节。 对不起,如果你这样写,你就不了解这个主题。 类比于十字架。 #include <iostream> struct alignas(4) A { short j; }; int main() { A q[2]; std::cout << sizeof(q) << std::endl; // 8 return 0; } 错误可能不在这里? TheXpert 2019.07.08 10:27 #25022 Vict: 我很抱歉,但如果你这样写,你就不了解这个主题。 不,你似乎不明白。 //g++ 5.4.0 #include <iostream> #pragma pack (push, 4) struct A { short j; }; #pragma pack (pop) int main() { A q[2]; std::cout << sizeof(q) << std::endl; // 4 return 0; } [删除] 2019.07.08 11:48 #25023 TheXpert: 不,你似乎不明白。 来自smallmicrosoft的#pragma包是一个非常奇特的东西(坦率地说,它的工作原理现在让我很吃惊)。不足为奇的是,标准的alignas工作方式有所不同。 这里有更多。 #include <iostream> struct A { short j; } __attribute__((aligned(4))); int main() { A q[2]; std::cout << sizeof(q) << std::endl; // 8 return 0; } TheXpert 2019.07.08 12:29 #25024 Vict: 小软体的#pragma包是一个非常奇特的东西(说实话,它的工作方式现在让我很吃惊)。难怪alignas在标准中的工作方式不同。 来吧)。 #include <iostream> struct A { short j; } alignas(4) ; int main() { A q[2]; std::cout << sizeof(q) << std::endl; // 4 return 0; } #pragma pack在gcc上也能正常工作,你写的只是一个gcc内部的属性,其工作方式与aligned不同。 [删除] 2019.07.08 12:58 #25025 TheXpert: 来吧,已经)。 #pragma pack在gcc上也能正常工作,你所写的只是gcc内部的一个属性,其工作方式与aligned不同。 那么这个例子说明了什么?你还没有搞清楚alignas的用途?就连编译器也对这段代码发誓。 1.cc:7:3: warning: attribute ignored in declaration of 'struct A' [-Wattributes] 7 | } alignas(4) ; | ^~~~~~~ 1.cc:7:3: note: attribute for 'struct A' must follow the 'struct' keyword #pragma包是一个奇怪的小softie创作,gcc只支持其兼容性。 TheXpert 2019.07.08 13:00 #25026 Vict: 那么这个例子说明了什么?你还没有搞清楚如何使用对准器? 我同意,我搞砸了。 这里是正确的代码。 #include <iostream> struct alignas(4) A { short j; } ; int main() { A q[2]; std::cout << sizeof(q) << std::endl; // 8 return 0; } 所以alignas并不类似于包装。 因为在同一个gcc中(所以没有smallsoft),包装的默认倍数是8 因为。 #include <iostream> struct A { short j; }; struct B { short j; long long k; }; int main() { A q[2]; B r[2]; std::cout << sizeof(q) << " " << sizeof(r) << std::endl; // 4 32 return 0; } 但用alignas(8) #include <iostream> struct alignas(8) A { short j; }; struct alignas(8) B { short j; long long k; }; int main() { A q[2]; B r[2]; std::cout << sizeof(q) << " " << sizeof(r) << std::endl; // 16 32 return 0; } TheXpert 2019.07.08 13:12 #25027 并注意到这是默认行为,不是为了与软件兼容 [删除] 2019.07.08 13:26 #25028 TheXpert: 并注意到这是默认行为,不是为了小微企业的兼容。 我不明白这个意思。例子中一切正常,我没有看到问题。默认--结构对齐==在成员中采取最严格的要求--对齐方式。 结构{char;}==1,结构{char;short} ==2,结构{char;int} ==4,等等。到处都是这样。而long long ==8,所以alignas没有影响。 TheXpert 2019.07.08 13:45 #25029 Vict: 我不明白这个意思。例子中一切正常,我没有看到问题。 是的,你是对的,这个例子是没有指标的。 底线是,mql pack的作用是#pragma pack,而不是alignas。 Francuz 2019.07.08 14:22 #25030 人们,分享一些信息。你用对齐的方法做什么? 1...249624972498249925002501250225032504250525062507250825092510...3184 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
那么,什么是错误呢?
你声明一个两个元素的数组,每个元素有两个字节,得到的是4个字节,应该是这样的。虫子在哪里?它是什么?
是这样的。
你对准4个和2个元素将占据2*8字节。
对不起,如果你这样写,你就不了解这个主题。
类比于十字架。
错误可能不在这里?
我很抱歉,但如果你这样写,你就不了解这个主题。
不,你似乎不明白。
不,你似乎不明白。
来自smallmicrosoft的#pragma包是一个非常奇特的东西(坦率地说,它的工作原理现在让我很吃惊)。不足为奇的是,标准的alignas工作方式有所不同。
这里有更多。
小软体的#pragma包是一个非常奇特的东西(说实话,它的工作方式现在让我很吃惊)。难怪alignas在标准中的工作方式不同。
来吧)。
#pragma pack在gcc上也能正常工作,你写的只是一个gcc内部的属性,其工作方式与aligned不同。
来吧,已经)。
#pragma pack在gcc上也能正常工作,你所写的只是gcc内部的一个属性,其工作方式与aligned不同。
那么这个例子说明了什么?你还没有搞清楚alignas的用途?就连编译器也对这段代码发誓。
#pragma包是一个奇怪的小softie创作,gcc只支持其兼容性。
那么这个例子说明了什么?你还没有搞清楚如何使用对准器?
我同意,我搞砸了。
这里是正确的代码。
所以alignas并不类似于包装。
因为在同一个gcc中(所以没有smallsoft),包装的默认倍数是8
因为。
但用alignas(8)
并注意到这是默认行为,不是为了小微企业的兼容。
我不明白这个意思。例子中一切正常,我没有看到问题。默认--结构对齐==在成员中采取最严格的要求--对齐方式。
结构{char;}==1,结构{char;short} ==2,结构{char;int} ==4,等等。到处都是这样。而long long ==8,所以alignas没有影响。
我不明白这个意思。例子中一切正常,我没有看到问题。
是的,你是对的,这个例子是没有指标的。
底线是,mql pack的作用是#pragma pack,而不是alignas。