Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在工会的情况下,这种记忆使用优化技术可能吗?_C++_Optimization_Memory_Compiler Construction_Unions - Fatal编程技术网

C++ 在工会的情况下,这种记忆使用优化技术可能吗?

C++ 在工会的情况下,这种记忆使用优化技术可能吗?,c++,optimization,memory,compiler-construction,unions,C++,Optimization,Memory,Compiler Construction,Unions,对于Union对象,编译器是否能够足够智能地检测在哪些点使用了Union的内存量,以便Union的剩余内存可以用作内存使用优化的其他用途,或者由于标准如何定义Union,甚至不允许这样做?否,活接头根据其最大构件的对齐要求对齐。否,活接头根据其最大构件的对齐要求对齐。否 要做到这一点,编译器必须知道您在任何给定时间“使用”的是什么。这怎么可能呢?如果您将“未使用”部分用于自己的优化,会怎么样 要做到这一点,编译器必须知道您在任何给定时间“使用”的是什么。这怎么可能呢?如果您将“未使用”部分用于自

对于Union对象,编译器是否能够足够智能地检测在哪些点使用了Union的内存量,以便Union的剩余内存可以用作内存使用优化的其他用途,或者由于标准如何定义Union,甚至不允许这样做?

否,活接头根据其最大构件的对齐要求对齐。

否,活接头根据其最大构件的对齐要求对齐。

要做到这一点,编译器必须知道您在任何给定时间“使用”的是什么。这怎么可能呢?如果您将“未使用”部分用于自己的优化,会怎么样


要做到这一点,编译器必须知道您在任何给定时间“使用”的是什么。这怎么可能呢?如果您将“未使用”部分用于自己的优化,该怎么办?

工会保留足够的空间来存储其最大的成员1。因此,根据定义,无论您是通过double还是字节存储,都会为
union{double a;byte b}
保留相同的空间

尽量不要将union视为一种变体类型,它可以是字节、双精度或整数,具体取决于您最近编写的成员。事实上,它是一种在同一内存区域上叠加多种不同数据类型的机制,因此该区域同时是一个浮点和一个int,以及一种量子叠加中的what have。这在需要绕过语言的类型系统时特别有用


1 ANSI/ISO 9899。

工会保留足够的空间来存储其最大的会员1。因此,根据定义,无论您是通过double还是字节存储,都会为
union{double a;byte b}
保留相同的空间

尽量不要将union视为一种变体类型,它可以是字节、双精度或整数,具体取决于您最近编写的成员。事实上,它是一种在同一内存区域上叠加多种不同数据类型的机制,因此该区域同时是一个浮点和一个int,以及一种量子叠加中的what have。这在需要绕过语言的类型系统时特别有用


1ANSI/ISO 9899。

不,不太可能。编译器无法知道在任何给定时间使用了多少空间。但是,没有理由在C++中使用一个联合,因为它只接受POD类型(稍微限制在C++ 0x),并且使用Boosi::变体和Booo::任何类型的周围,都不需要这样的语言特征。

< P>不,不是真的。编译器无法知道在任何给定时间使用了多少空间。但是,C++中没有使用联盟的理由,因为它只接受POD类型(稍微限制在C++ 0x),并且使用Boosi::变体和Booo::任何类型的周围,都不需要这样的语言特征。

< P>我不能思考如何。

它不能为不同的对象使用额外的空间,因为除非一个对象是另一个对象的子对象,否则对象在内存中不会重叠

而且,如果你能在任何时候都写下联盟中最大的成员,它就根本不能使用额外的空间

在这样的代码中:

{
    union { char c; double d; } x;
    x.c = 1;
    int y;
    some_function(&y);
    std::cout << x.c;
}
但是,如果
某些函数
保留指向
y
的指针的副本,可能是在全局范围内,该怎么办?如果重载的
操作符我想不出该怎么做

它不能为不同的对象使用额外的空间,因为除非一个对象是另一个对象的子对象,否则对象在内存中不会重叠

而且,如果你能在任何时候都写下联盟中最大的成员,它就根本不能使用额外的空间

在这样的代码中:

{
    union { char c; double d; } x;
    x.c = 1;
    int y;
    some_function(&y);
    std::cout << x.c;
}

但是,如果
某些函数
保留指向
y
的指针的副本,可能是在全局范围内,该怎么办?然后,如果重载的
运算符理论上是可行的。如果编译器足够聪明,能够分析您的程序,并且发现您从未使用过它所能容纳的最大类型,那么它可以根据“仿佛”规则优化程序。(程序的行为——除了计时之外——必须像没有进行优化一样。)


但编译器不太可能做到这一点。这很难做到,而且很少适用

理论上,这是可能的。如果编译器足够聪明,能够分析您的程序,并且发现您从未使用过它所能容纳的最大类型,那么它可以根据“仿佛”规则优化程序。(程序的行为——除了计时之外——必须像没有进行优化一样。)


但编译器不太可能做到这一点。这很难做到,而且很少适用

您只能阅读最后一个书面成员。编译器可以用余数做任何它想做的事情。在一个体系结构上的一种实用方法,在写入一个较大联合的字节大小的成员时,该体系结构只能写入完整的字,而不需要注意将其他字节排除在外。您只能读取最后写入的成员。编译器可以用余数做任何它想做的事情。在一个体系结构上的一个实际应用,在编写一个较大联合体中字节大小的成员时,它只能写完整的字,而不需要注意将其他字节排除在外。如果您需要在同一内存区域中覆盖两个不相关的结构,这样您就可以以特定于平台的方式戳它们,这仍然是必要的。例如,
联合函数描述符{uint64 i;void(*fptr)();结构{void*toc;void*codemaddress;};}可能是从函数指针(实际上是指向描述符的指针,等等)中分别查找TOC和IP部分的最简单方法。如果需要在同一内存区域中覆盖两个不相关的结构,以便可以在platfor中戳它们,则仍然需要使用代码>