Visual Studio C++ 2008/2010是否_mm_malloc正式支持?它已定义,malloc.h但我无法在MSDN库中找到它的描述.
我正在尝试执行一个理论上可行的内存优化,但我开始怀疑是arm-elf-gcc的能力.请告诉我,我错了.
我有一个嵌入式系统,主内存非常少,电池支持的nvram数量更少.我将校验和配置数据存储在nvram中,以便在启动时我可以验证校验和并继续前一次运行或在校验和无效时开始新的运行.在运行期间,我在此配置数据中更新各种大小的各种字段(并且可以使校验和无效,直到稍后重新计算).
所有这些都在物理地址空间中运行 - 正常的sram映射在一个位置,nvram映射到另一个位置.这是擦除 - 所有对nvram的访问必须以32位字进行; 不允许字节或半字访问(虽然它在主存中显然很好).
因此,我可以a)将所有配置数据的工作副本存储在主存储器中,并在重新计算校验和时将其存储到nvram中,或者b)直接在nvram中使用它,但不知何故说服编译器所有结构都是打包和所有访问不仅必须是32位对齐,还必须是32 位宽.
选项a)浪费宝贵的主内存,我宁愿通过选项b)进行运行时权衡以保存它(尽管不是代码大小最终浪费的东西比我节省的数据大).
我希望这__attribute__ ((packed, aligned(4)))或其中的一些变化可以帮到这里,但到目前为止我所做的所有阅读和实验都让我失望了.
这是我正在处理的配置数据的玩具示例:
#define __packed __attribute__ ((packed))
struct __packed Foo
{
uint64_t foo;
struct FooFoo foofoo;
}
struct __packed Bar
{
uint32_t something;
uint16_t somethingSmaller;
uint8_t evenSmaller;
}
struct __packed PersistentData
{
struct Foo;
struct Bar;
/* ... */
struct Baz;
uint_32 checksum;
}
Run Code Online (Sandbox Code Playgroud)
您可以想象不同的线程(每个线程执行Foo,Bar和Baz函数)根据需要更新自己的结构,并在某些时候进行同步以声明重新计算校验和并进入休眠状态的时间.
我有一个数组,用作类型对象的底层内存T:
char memory[sizeof T];
.
.
.
new(memory) T(whatever);
Run Code Online (Sandbox Code Playgroud)
如何确保对象memory正确对齐T?在C++ 0x中我可以说:
alignas(T) char memory[sizeof T];
Run Code Online (Sandbox Code Playgroud)
但Visual Studio 2010尚不支持该特定功能.
如果动态行向末端移动,则获取数据的速度之间是否存在任何差异.
例如:int,int,int,text是否比int int text int好?
我的领导告诉我这个事实,从互联网上怎么没有这样的信息?请帮忙 ?
我正在尝试使用std :: aligned_storage模式实现简单静态数组的16字节对齐:
#include <type_traits>
int main()
{
const size_t SIZE = 8;
using float_16 = std::aligned_storage<sizeof(float) * SIZE, 16>::type;
float_16 mas;
new(&mas) float[SIZE];//Placement new. Is this necessary?
mas[0]=1.f;//Compile error while attempting to set elements of aligned array
}
Run Code Online (Sandbox Code Playgroud)
我得到以下编译错误:
«mas [0]»中«operator []»不匹配
然后我尝试使用显式指针转换:
float* mas_ = reinterpret_cast<float*>(mas);
Run Code Online (Sandbox Code Playgroud)
但这也会产生编译错误:
从类型«float_16 {aka std :: aligned_storage <32u,16u> :: type}»无效转换为类型«float*»
任何人都可以建议我如何正确使用std :: aligned_storage对齐静态数组?
我有一个适用于PowerPC的巨大源代码.我需要将它移植到ARM.但是,ARM在未对齐的内存访问上生成h/w异常.所以,我想找到所有可能发生未对齐内存访问异常的实例.我考虑过以下几种选择.
我的问题是,
为了使它具体,我只想知道为什么在我的64位mac上,Swift编译器说某些类型的对齐方式Float80是16.
要检查类型的内存对齐要求,我使用该alignof函数.
sizeof(Float80) // ~> 16 bytes, it only needs 10 bytes, but because of hardware design decisions it has to be a power of 2
strideof(Float80) // ~> 16 bytes, clear because it is exact on a power of 2, struct types with Float80 in it, can be bigger
alignof(Float80) // ~> 16 bytes, why not 8 bytes, like String ?
Run Code Online (Sandbox Code Playgroud)
我理解类型的内存对齐小于或等于单词的大小是有益的.
sizeof(String) // ~> 24 bytes, clear because 24 is multiple of …Run Code Online (Sandbox Code Playgroud) 在读这篇文章时,我惊讶于某个程度的元编程可以为你的班级布局做些什么.我必须承认,如果我不得不陈述我的理解,我不会完全掌握建议的最佳布局是什么:
通过降序排列来排序类成员,即具有最大
alignof结果的类型首先等
如果我弄错了,请随意纠正我(如果你有一个简短的解释为什么会发生这种情况会更好,我无法在我的问题中复制粘贴大部分理由),但我的问题是关于另一个话题:
任何库实现std::tuple都有这样的布局优化吗?
如果没有,是否有任何标准的代数数据类型,除了编写这样的机器之外,还有另一种方法可以为我的班级做这个吗?
这是自定义分配器中的内存布局: -
^ toward less address
....
Header [size=16 alignment=4 ] ....(1)
some waste space A [size=A (unknown) ]
content [size="SIZE" alignment="ALIGN"] ....(2)
some waste space B [size=B (unknown) ]
Header [size=16 alignment=4 ] ....(3)
....
v toward more address
Run Code Online (Sandbox Code Playgroud)
Header事先并不知道确切的地址.
但是,我知道: -
every Header address % 4 == 0 from (1,3)
"content"%ALIGN == 0 from (2)
Run Code Online (Sandbox Code Playgroud)
如何确定最小字节数A+content+B使得所有内容(1和2和3)始终正确对齐?
//return maximum size of A+content+B that make the allocation always safe
int wasteA_content_wasteB(int SIZE,int ALIGN){
//??? …Run Code Online (Sandbox Code Playgroud) 以下显然有效的代码使用UndefinedBehaviorSanitizer sanitiser产生错位的地址运行时错误.
#include <memory>
#include <functional>
struct A{
std::function<void()> data; // seems to occur only if data is a std::function
} ;
struct B{
char data; // occurs only if B contains a member variable
};
struct C:public virtual A,public B{
};
struct D:public virtual C{
};
void test(){
std::make_shared<D>();
}
int main(){
test();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在macbook上编译和执行
clang++ -fsanitize=undefined --std=c++11 ./test.cpp && ./a.out
产生输出
runtime error: constructor call on misaligned address 0x7fe584500028 for type 'C', which requires 16 byte …