字体对齐会修改字体大小吗?
Does type alignment modify type size?
我编写了以下代码并在gcc上进行了测试:
// firstly some platform-specific workarounds
#if _MSC_VER
#define ALN_BEGIN(x) __declspec(align(x))
#define ALN_END(x)
#define alignof(x) __alignof(x)
#else
#define ALN_BEGIN(x)
#define ALN_END(x) __attribute__((aligned(x)))
#define alignof(x) __alignof__(x)
#endif
// struct have three 4-byte members, but aligned at 32 byte
ALN_BEGIN(32) struct Foo
{
float a;
float b;
float c;
} ALN_END(32);
// show its size and alignment
int main(int argc, char** argv)
{
printf("size %d, alignment%dn", sizeof(Foo), alignof(Foo));
}
当我使用gcc编译它并运行时,虽然Foo的所有成员只有12个字节,但sizeof(Foo)
得到32个字节,这是对齐大小。那么,大小扩展是根据语言标准(这是可靠的)进行的,还是仅仅是GCC的一个特性?
我正在创建一个对象池类,所以我必须精确地处理类型大小和对齐。
是的,这是符合标准的。sizeof (X)
基本上定义为数组中两个连续X
对象的起始地址之间的字节偏移量。如果这些对象由于对齐限制而不能紧密跟随,则sizeof
相应增大。
引用c++ 14,5.3.3/2:
…当应用对于一个类,结果是该类对象中的字节数,包括所需的填充将该类型的对象放在数组. ...中当应用对于数组,结果是数组中的总字节数。这意味着n数组的大小 = n元素的大小。
(强调我的)
对于任何类型(char
类型除外,根据定义其大小为1
), sizeof
的结果是实现定义的,并且受对齐的影响。然而,如果
-
sizeof(float)
is4
; - 你的结构包含三个
floats
;和 - 结构体的开始和结束都以32字节的边界对齐。
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 在C++中测量postscript字体宽度
- 独立读取-修改-写入顺序
- 当系统的卷被修改时,如何修改WASAPI环回捕获卷
- 修改函数中的指针(将另一个指针作为参数传递)
- 为什么我可以通过引用修改常量返回
- 对于结构,表达式必须是可修改的ivalue
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 为什么不能修改对象中的值?另外,我如何改进此链表?
- 修改创建帐户程序
- 我应该如何修改此代码以使用给定字符串中的字母打印菱形图案
- 如何在Directwrite中获得给定字体的可用OpenType功能
- 如何从子成员函数修改父公共成员变量
- 修改 VS Code 中的默认C++代码段
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 如何使用递归打印修改后的星号三角形图案
- 已修改的LinkedList未在文本文件本身中更新
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- GDI 在 MFC 中修改字体
- 字体对齐会修改字体大小吗?