jjzjj

c++ - std::vector 应该尊重 alignof(value_type) 吗?

如果我定义一个具有特定对齐要求的简单类型,该类型的std::vector难道不应该为每个元素遵守对齐吗?考虑下面的例子typedefstd::arrayalignas(32)avx_point;std::vectorx(10);assert(!(std::ptrdiff_t(&(x[0]))&31)&&//assertthatx[0]is32-bytealigned!(std::ptrdiff_t(&(x[1]))&31));//assertthatx[1]is32-bytealigned我发现clang3.2(带或不带-stdlib=libc++)悄悄地(没有任何警告)违反了对齐要求

c++ - 英特尔编译器 - 错误 : identifier "alignof" is undefined

我正在尝试运行alignof运算符的示例。#includestructEmpty{};structFoo{intf2;floatf1;charc;};intmain(){std::cout当我用gcc(g++-std=c++11alignof.cpp)编译它时,我没有得到任何错误。但是当我用icc(icpc-std=c++11alignof.cpp)编译它时,我得到以下错误,我不知道为什么:cenas.cpp(13):error:typenameisnotallowedstd::cout我在同一台机器上运行代码,并使用module命令更改编译器。alignof运算符怎么可能未定义?

c++ - 为什么这个 EXC_BAD_ACCESS 发生在 long long 而不是 int 上?

我遇到了一个EXC_BAD_ACCESS,其中包含一段处理数据序列化的代码。该代码仅在设备(iPhone)上失败,在模拟器上不会。它还仅在某些数据类型上失败。这是重现问题的测试代码:templatevoidtest_alignment(){//allocatememoryandrecordtheoriginaladdressunsignedchar*origin;unsignedchar*tmp=(unsignedchar*)malloc(sizeof(unsignedshort)+sizeof(T));origin=tmp;//pushdatawithsizeof2bytes*((u

c++ - 为什么 char 数组的 alignof 总是 1?

我正在阅读一些关于C++中对齐的内容,但我不确定为什么仅包含char数组成员的类的对齐不是数组的大小,但事实证明始终为1。例如#includestructFoo{charm_[16];};//shouldn'tthishavea16bytealignment?!intmain(){std::coutLiveonColiru在上面的代码中很明显sizeof(Foo)是16,但是它的对齐是1,看代码的输出。为什么alignof(Foo)在这种情况下是1?请注意,如果我将charm_[16];替换为intm_;之类的基本类型,那么alignof(Foo)就会变成我想要的已经预料到了,即siz

c++ - std::vector 应该尊重 alignof(value_type) 吗?

如果我定义一个具有特定对齐要求的简单类型,该类型的std::vector难道不应该为每个元素遵守对齐吗?考虑下面的例子typedefstd::arrayalignas(32)avx_point;std::vectorx(10);assert(!(std::ptrdiff_t(&(x[0]))&31)&&//assertthatx[0]is32-bytealigned!(std::ptrdiff_t(&(x[1]))&31));//assertthatx[1]is32-bytealigned我发现clang3.2(带或不带-stdlib=libc++)悄悄地(没有任何警告)违反了对齐要求

c++ - `std::alignment_of` 与 `alignof`

我刚刚偶然发现了std::alignment_of类型特征,以及它即将成为friend的std::alignment_of_v。它们似乎经过专门设计,相当于对alignof的简单调用。,并且将来添加的_v助watch明它不仅仅是一个遗留位。当我们有alignof时,std::alignment_of(_v)有什么用? 最佳答案 它们几乎完全是多余的。正如@Revolver指出的那样,它们在不同的论文中被介绍过,并且alignment_of来自boost几乎一字不差。但这并不意味着该特征是无用的。Atemplateclass可以传递给

c++ - 是否 sizeof(T) == sizeof(const T) 和 alignof(T) == alignof(const T)

假设T和constT是两种大小相同且对齐方式相同的类型似乎是合理的,但在考虑了一些实际系统之后,似乎它们可能会有所不同。让我解释一下:假设您的系统具有两种类型的内存:RAM和闪存(只读)。RAM是8位可寻址的,而Flash只能是16位可寻址的。假设这是T:structT{uint8_tx;uint16_ty;};在字节可寻址RAM中,该结构体的长度为3个字节......但在双字节可寻址闪存(const变量所在的位置)中,该结构体必须位于由于对齐问题,至少4个字节长。所以这是我的问题:c和c++标准是否保证const和非const类型的大小和对齐方式? 最佳答

c++ - sizeof 和 alignof 有什么区别?

sizeof和alignof有什么区别?#include#defineSIZEOF_ALIGNOF(T)std::cout会输出1/11/12/22/24/44/44/44/44/48/88/88/8我想我不明白对齐是什么...? 最佳答案 嗯,“内存”基本上是一个巨大的字节数组。然而,像整数这样较大的东西需要超过1个字节来存储它们——例如,一个32位的值将使用4个连续字节的内存。现在,您计算机中的内存模块通常不是“字节”;它们也以“并行”的几个字节组织,例如4个字节的block。对于CPU,在读取诸如整数之类的内容时,不“跨越”此

c++ - 内存对齐 : how to use alignof/alignas?

我现在使用共享内存。我无法理解alignof和alignas。cppreference不清楚:alignof返回“对齐”,但什么是“对齐”?为要对齐的下一个block添加的字节数?填充尺寸?Stackoverflow/博客条目也不清楚。谁能解释清楚alignof和alignas? 最佳答案 对齐是对可以存储值的第一个字节的内存位置的限制。(需要提高处理器的性能并允许使用某些指令,这些指令仅适用于具有特定对齐方式的数据,例如SSE需要对齐到16字节,而AVX需要对齐到32字节。)16对齐意味着只有16的倍数的内存地址是唯一有效的地址。

c++ - 对于所有对象类型 T,sizeof(T) >= alignof(T) 是否总是如此?

对于任何对象类型T,是否总是sizeof(T)至少与alignof(T)一样大?直觉上似乎是这样,因为即使您调整对象的对齐方式,例如:structsmall{charc;};在正常情况下,它们的“大小”也向上调整,以便数组中对象之间的关系在保持对齐的同时有意义(至少在我的testing中。例如:structalignas(16)small16{charc;};大小和对齐方式均为16。 最佳答案 至少在标准C++中,对于任何可以创建数组(长度>1)的东西,都必须是这样。如果你有Fooarr[2];和alignof(Foo)>sizeo
12