Visual C++让你在项目的属性页面中选择结构成员alignemnt.问题是,此配置正用于项目中的所有srtructs.
是否有任何方法(特定于VC++,我猜)可以单独设置某个struct的成员对齐?
我想知道,大多数实现calloc将大小视为一个对齐,并将其四舍五入到下一个支持的粒度?
如果是这样,那么它们是否会向下舍入到2的下一个幂,或者它们是否会转到下一个8或16的倍数?
如果calloc保持参数相同,那么它甚至如何工作?那你的数据不会不对齐吗?
谢谢!
有
any_type *ptr = (any_type*)malloc(sizeof(any_type)*size);
my_ptr = ptr+1;
memcpy(dst, my_ptr, sizeof(any_type));
Run Code Online (Sandbox Code Playgroud)
将my_ptr指向ptr后的1个字节,还是sizeof(any_type)ptr后的字节?对齐选项如何影响答案?签名/未签名类型是不同的?
我需要分配具有大对齐的内存(兆字节)的大区域(也可能在兆字节范围内).VirtualAlloc系列函数似乎没有提供执行此操作的选项.
我在Linux上为实现这一点而做的是mmap一个更大的区域 - 足够大以保证在其中包含具有所需对齐的足够大的区域 - 然后在大区域的开始和结束处对区域进行munmap不需要.
举个例子,假设我需要4兆字节,在1兆字节的边界上对齐(即在最低的20位中具有零的区域的起点).我想要5兆字节.假设我得到区域0x44ff000-0x49ff000.在该区域内包含区域0x4500000-0x4900000,该区域在1兆字节边界上对齐.然后我将munmap 0x44ff000-0x4500000和0x4900000-0x49ff000.
我可以在Win32上做类似的事情吗?如果我将VirtualProtect与PAGE_NOACCESS一起使用,是否会释放内存?有更好的解决方案吗?
很抱歉这个非常简单的问题,找不到谷歌回答.
这是声明语法:
__declspec(align(16)) float rF[4];
__declspec(align(16)) float gF[4];
__declspec(align(16)) float bF[4];
Run Code Online (Sandbox Code Playgroud)
相当于:
__declspec(align(16)) float rF[4], gF[4], bF[4];
Run Code Online (Sandbox Code Playgroud)
或者只有第一个变量在后一种语法中对齐?
如果重要,那么这些是全局方法中的局部变量.
我想尝试使用C++中的SSE instrincs来获取一些浮点数的平方根.但是当我尝试存储结果时,我得到一个例外.我可以像这样使用std :: aligned_storage吗?
#include <iostream>
#include <type_traits>
#include <xmmintrin.h>
using namespace std;
using float_storage = aligned_storage<4 * sizeof(float), 16>;
int main()
{
int N;
cin >> N;
float_storage * values = new float_storage[ N / 4 ]; // 4 floats in pack
for(int i = 0; i < N / 4; i++)
{
void *vptr = static_cast<void*>(&values[i]);
float *fptr = static_cast<float*>(vptr);
for(int i = 0; i < 4; i++)
cin >> fptr[i];
}
for(int i = 0; i < …Run Code Online (Sandbox Code Playgroud) 我知道C结构中的成员与他们需要的任何边界对齐.
struct S {
uint8_t ui8;
/* invisible padding here */
uint32_t ui32;
};
Run Code Online (Sandbox Code Playgroud)
我的问题是,struct S是否定义了实例的对齐方式?
struct S my_s;
Run Code Online (Sandbox Code Playgroud)
是否my_s定义了对齐?是否struct S会ui32成为其第一个成员是否重要?
我搜索过但只找到了关于struct member alignment的信息.
我正在执行一系列活动,以确保Redis在一组嵌入式系统中运行良好,包括Raspberry PI.为了修复Redis的某些代码路径,其中执行了未对齐的内存访问(由于Redis 3.2中引入的更改),我试图强制PI在未对齐的内存访问上记录消息或者向进程发送信号有时候是这样的.通过这种方式,我可以确保Redis在未对齐访问是违规的情况下运行良好,并且它将在平台中运行得更快,而平台可以执行此类访问但速度较慢.在PI v1中使用的ARM v6显然能够处理未对齐的内存访问,因此如果我使用以下命令配置Linux以便向执行未对齐访问的进程发送信号:
echo 4 > /proc/cpu/alignment
Run Code Online (Sandbox Code Playgroud)
然后运行以下程序:
#include <stdio.h>
#include <stdint.h>
int main(int argc, char **argv) {
char *buf = "foobareklsjdfklsjdfslkjfskdljfskdfjdslkjfdslkjfsd";
uint32_t *l = (uint32_t*) (buf+1);
printf("%p\n", l);
printf("%d\n", (int)*l);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我看不到进程收到的任何信号,或者/proc/cpu/alignment递增的计数器.
我的猜测是,这是由于ARM v6能够自动处理未对齐的地址,如果设置了给定的CPU配置标志.我的问题是,我的假设是否正确?如果是这样,如果未对齐访问,如何强制PI版本1实际引发异常,以便Linux内核可以捕获它并发送信号,记录访问权限等等,根据/ proc/cpu/alignment设置?
编辑:值得注意的是,即使在ARM v6中,并非所有指令都可以执行未对齐的访问.例如,STMDB,STMFD,LDMDB,LDMEA和类似的多个单词指令确实会引发异常并将被Linux内核捕获.
换句话说:如果我有这样分配的数组,它是否可以保证:
void *arr = calloc(nmemb, sizeof(some_type))
Run Code Online (Sandbox Code Playgroud)
然后elta,eltb,eltc将所有指向在存储器中的相同位置,这将是类型的第二个元素some_type此数组的?
some_type *elta = &((some_type*)arr)[1];
some_type *eltb = ((some_type*)arr)+1;
some_type *eltc = (char*)arr+sizeof(some_type);
Run Code Online (Sandbox Code Playgroud)
我问这个的原因是因为我试图在C中做一个"容器",如果这不成立,那么我就没有想法如何返回指向除第一个之外的任何其他元素的指针.
我正在创建这个简单的测试程序来演示使用标准new分配内存时对齐的工作方式...
#include <iostream>
#include <iomanip>
#include <cstdint>
//
// Print a reserved block: its asked size, its start address
// and the size of the previous reserved block
//
void print(uint16_t num, uint16_t size_asked, uint8_t* p) {
static uint8_t* last = nullptr;
std::cout << "BLOCK " << num << ": ";
std::cout << std::setfill('0') << std::setw(2) << size_asked << "b, ";
std::cout << std::hex << (void*)p;
if (last != nullptr) {
std::cout << ", " << std::dec << (uint32_t)(p - …Run Code Online (Sandbox Code Playgroud) memory-alignment ×10
c ×4
c++ ×4
struct ×2
arm ×1
arrays ×1
c++11 ×1
calloc ×1
declspec ×1
gcc ×1
heap-memory ×1
new-operator ×1
padding ×1
pointers ×1
raspberry-pi ×1
sse ×1
syntax ×1
visual-c++ ×1
winapi ×1