标签: memory-alignment

Visual C++ 2008中的Struct成员对齐方式

Visual C++让你在项目的属性页面中选择结构成员alignemnt.问题是,此配置正用于项目中的所有srtructs.

是否有任何方法(特定于VC++,我猜)可以单独设置某个struct的成员对齐?

struct memory-alignment visual-c++

3
推荐指数
1
解决办法
3877
查看次数

如果我说calloc(1000,23),23"圆形"到24吗?或者到32?

我想知道,大多数实现calloc将大小视为一个对齐,并将其四舍五入到下一个支持的粒度?

如果是这样,那么它们是否会向下舍入到2的下一个幂,或者它们是否会转到下一个8或16的倍数?

如果calloc保持参数相同,那么它甚至如何工作?那你的数据不会不对齐吗?

谢谢!

c memory-alignment calloc

3
推荐指数
1
解决办法
261
查看次数

C/C++指针,ptr + 1 = ptr + 1字节或ptr + 1*sizeof(pointer_type)?

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后的字节?对齐选项如何影响答案?签名/未签名类型是不同的?

c c++ gcc pointers memory-alignment

3
推荐指数
1
解决办法
3934
查看次数

具有大对齐的Win32内存分配

我需要分配具有大对齐的内存(兆字节)的大区域(也可能在兆字节范围内).VirtualAlloc系列函数似乎没有提供执行此操作的选项.

我在Linux上为实现这一点而做的是mmap一个更大的区域 - 足够大以保证在其中包含具有所需对齐的足够大的区域 - 然后在大区域的开始和结束处对区域进行munmap不需要.

举个例子,假设我需要4兆字节,在1兆字节的边界上对齐(即在最低的20位中具有零的区域的起点).我想要5兆字节.假设我得到区域0x44ff000-0x49ff000.在该区域内包含区域0x4500000-0x4900000,该区域在1兆字节边界上对齐.然后我将munmap 0x44ff000-0x4500000和0x4900000-0x49ff000.

我可以在Win32上做类似的事情吗?如果我将VirtualProtect与PAGE_NOACCESS一起使用,是否会释放内存?有更好的解决方案吗?

winapi memory-management memory-alignment virtual-memory

3
推荐指数
1
解决办法
1208
查看次数

__declspec(align)用于多个声明

很抱歉这个非常简单的问题,找不到谷歌回答.

这是声明语法:

__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++ syntax visual-studio-2010 memory-alignment declspec

3
推荐指数
1
解决办法
841
查看次数

尝试将std :: aligned_storage与SSE和new一起使用

我想尝试使用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++ memory-management sse memory-alignment c++11

3
推荐指数
1
解决办法
292
查看次数

是否在C中定义了结构类型的对齐方式?

我知道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 Sui32成为其第一个成员是否重要?

我搜索过但只找到了关于struct member alignment的信息.

c struct memory-alignment

3
推荐指数
1
解决办法
125
查看次数

Raspberry PI版本1未检测到未对齐的访问

我正在执行一系列活动,以确保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内核捕获.

arm memory-alignment raspberry-pi

3
推荐指数
1
解决办法
576
查看次数

是否保证C中的数组元素将连续存储,没有填充?

换句话说:如果我有这样分配的数组,它是否可以保证:

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中做一个"容器",如果这不成立,那么我就没有想法如何返回指向除第一个之外的任何其他元素的指针.

c arrays padding memory-alignment pointer-arithmetic

3
推荐指数
1
解决办法
117
查看次数

为什么new第一次分配1040个额外字节?

我正在创建这个简单的测试程序来演示使用标准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)

c++ heap-memory memory-alignment new-operator

3
推荐指数
1
解决办法
82
查看次数