我最近修复了一个错误,其中一个__declspec(align(64))结构的成员由于分配结构的内存的方式而未对齐.所以,我正在寻找解决这种情况的方法.
例如,请考虑以下结构:
struct foo {
__declspec(align(64)) int bar[BAZ_LEN];
int baz;
};
Run Code Online (Sandbox Code Playgroud)
如果在堆栈上分配,编译器将负责对齐.如果通过分配malloc(),它将无法工作.如果出于性能或正确性原因(或两者)依赖于其对齐,这将破坏访问bar的代码.
所以,问题是:处理这种情况的最佳方法是什么?在我的情况下struct foo,除了我的组件的"私有"函数之外的所有函数都可以认为是不透明的.
澄清/更新.非常感谢你的答案.我应该事先说过这个问题,但问题是我的struct的用户分配了一大块内存并将其分成多个部分,其中一个中间部分是一个foo_tstructus 数组.该数组的偏移量不是常数,因此对齐起始地址可能没有帮助.我正在寻找一种方法来允许这样使用我的结构,同时保留一些对齐假设.
我现在想到的解决方案(还没试过这个)是添加一个填充成员:
struct foo {
__declspec(align(64)) int bar[BAZ_LEN];
int baz;
char padding[64];
};
Run Code Online (Sandbox Code Playgroud)
并且在每个函数中执行以下操作(包装在宏中):
void f(foo_t *foo_)
{
foo_t *foo = (foo_t *)(((uintptr_t)foo_ & ~63) + 64);
...
}
Run Code Online (Sandbox Code Playgroud)
这会浪费每个结构64个字节,这在我的情况下不是问题.由于从不访问填充成员,因此移位不会导致任何段错误.然而,这个解决方案增加了相当多的心理开销,因为必须为每个公共函数清理对齐...
Visual Studio C++ 2008/2010是否_mm_malloc正式支持?它已定义,malloc.h但我无法在MSDN库中找到它的描述.
我在C中有一个接受uint8_t *参数的函数,该参数必须指向32位对齐的内存。是否可以在C或C ++或任何特定平台的宏中为参数添加一些修饰,以使编译器或链接器在未按要求对齐时在构建时抛出错误?
这里的想法是我想保护该功能,以防止其他用户(或我六个月内)不当使用该功能。我知道如何对齐我想传递给它的东西。我想确保没有人可以将未对齐的内容传递给它。
基于此答案,我认为我的问题的答案为“否”,无法在构建时强制执行此操作,但这似乎是一个有用的功能,因此我想检查一下。我的解决方法是assert((((size_t)ptr) % 4) == 0);函数,以便至少在调试时可以在运行时捕获它。
根据我的经验,结果,如果你投了错位未定义uint8_t*到uint32_t*许多嵌入式平台,所以我不想在“正确”的结果出来到底算。另外,这是在实时系统上使用的,因此放慢速度是不可接受的。
欢迎引用(如果有)。
我已经制作了ac/c ++程序(printf和的混合std::)来了解不同的缓存性能.我想并行化一个计算大块内存的进程.我必须在相同的内存位置上进行多次计算,因此我会在结果上写入结果,覆盖源数据.当第一个微积分完成后,我再做一个以前的结果.
I've guessed if I have two threads, one making the first calculus, and the other the second, I would improve performance because each thread does half the work, thus making the process twice as fast. I've read how caches work, so I know if this isn't done well, it may be even worse, so I've write a small program to measure everything.
(See below for machine topology, CPU type and flags and source code.) …
在我的程序中,我需要申请__attribute__(( aligned(32)))一个int *或float *
我试过这样但我不确定它会起作用。
int *rarray __attribute__(( aligned(32)));
Run Code Online (Sandbox Code Playgroud)
我看到了这个,但没有找到答案
作为类的程序的一部分,我必须以特定的方式打印输出,分成16个字节的块.我一直在寻找一种将指针转换为int或其他方式来对存储在变量中的指针地址执行模数或除法运算的方法.我遇到了障碍,这里的任何人都知道如何执行这个看似简单的操作吗?这是函数的基本形式:
void printAddress(char *loc, char *minLoc, char *maxLoc) {
minLoc = (loc - (loc % 16));
maxLoc = minLoc + 16;
printf("%p - %p - %p", minLoc, loc, maxLoc);
}
Run Code Online (Sandbox Code Playgroud)
我删除了所有我投射它的尝试,以明确我正在尝试做什么.
我无法理解为什么addr被长时间类型化,然后用表达式补充..基本上涉及peekAddr计算的整行
void *addr;
char *peekAddr ;
peekAddr = (char *) ((long)addr & ~(sizeof(long) - 1 ) ) ;
peekWord = ptrace( PTRACE_PEEKDATA, pid, peekAddr, NULL ) ;
Run Code Online (Sandbox Code Playgroud) int getmin(int a, int b)
{
return a<b?a:b;
}
void *reallocation(void *ptr, size_t size) //size_t in bytes
{
void *newptr;
int msize;
msize = getsize(ptr);
msize = getmin(msize, size);
printf("msize = %d", msize);
newptr = malloc(size);
newptr = memcpy(newptr, ptr, msize);
free(ptr);
return newptr;
}
Run Code Online (Sandbox Code Playgroud)
我已经实现了自己的realloc,并且为了使用malloc获得分配的内存的大小(但是我知道在c中没有任何方法).
我的重新分配功能在我的系统上正常工作我们如何获得malloc()分配的内存大小.
如果先前分配的内存大小大于新的所需内存,我们也可以进行内部重新分配吗?
任何人都可以向我解释以下代码吗?
adjustedbuf = (void *) ((uint64_t) buf & ~(pagesize - 1))
Run Code Online (Sandbox Code Playgroud)
我不明白这个说法.
在一个采访样本中遇到了这个问题.在如何仅使用标准库分配对齐的内存中已经回答了16字节对齐的分配?
但是,我有一个特定的问题,关于用于将最后4位归零的掩码.已使用此掩码"~0F",使得结果地址可被16整除.对于32字节对齐/可分割,应采取哪些措施来实现相同的目的?
当我检查地址是否为64字节对齐时,出现编译错误。
错误:对二进制表达式无效的操作数(“ void *”和“ int”)
#define BYTE_ALIGNMENT 64
void *is_mem_aligned(void* ptr){
if(ptr%BYTE_ALIGNMENT == 0){
printf("already aligned %p\n",ptr);
return ptr;
}
}
Run Code Online (Sandbox Code Playgroud)