警告C4316:在堆上分配的对象可能不对齐16 [英] warning C4316: object allocated on the heap may not be aligned 16

查看:4035
本文介绍了警告C4316:在堆上分配的对象可能不对齐16的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

重要信息:




  • 开发操作系统:Windows 8.1 64位

  • 目标作业系统:Windows 8.1 64位

  • IDE:Visual Studio 2013 Professional

  • 语言:C ++
  • / ul>

    问题:



    在编译我的静态库项目时收到以下警告通过IDE:

     警告C4316:...:堆上分配的对象可能不对齐16 

    我可以忽略这个警告...但我假设它在那里有一个原因,并希望至少理解



    我相信这行代码与问题相关,它被称为在我的Win32窗口包装类中:

      m_direct3D = new Direct3D(this); 

    m_direct3D是指向我的Direct3D包装器类的指针。



    这是包装器的头文件(我承认需要修剪):

      #pragma once 

    // Windows
    #include< d3d11.h>
    #include< DirectXMath.h>

    //标准
    #include< stdint.h>
    #include< vector>

    // JGlib
    #includeWindow.h

    命名空间JGlib
    {
    命名空间图形
    {
    class Direct3D
    {
    public:
    // Construtor和destructor
    Direct3D(const JGlib :: Graphics :: Window * window);
    〜Direct3D();

    //公共方法
    void Initialise();
    void BeginDraw();
    void Draw();
    void EndDraw();

    private:
    //私有方法

    //私有成员变量
    const Window * m_window;
    ID3D11Device * m_device;
    IDXGIAdapter * m_adapter;
    DXGI_ADAPTER_DESC m_adapterDescription;
    uint32_t m_videoCardMemory;
    IDXGIFactory * m_factory?
    IDXGIOutput * m_monitor;
    DXGI_MODE_DESC * m_displayModes;
    uint32_t m_numberOfModes;
    DXGI_RATIONAL m_refreshRate;
    DXGI_SWAP_CHAIN_DESC m_swapChainDescription;
    D3D_FEATURE_LEVEL m_featureLevel;
    ID3D11DeviceContext * m_deviceContext;
    IDXGISwapChain * m_swapChain;
    ID3D11Texture2D * m_backBuffer;
    ID3D11RenderTargetView * m_renderTargetView;
    ID3D11Texture2D * m_depthStencilBuffer;
    D3D11_TEXTURE2D_DESC m_depthBufferDescription;
    D3D11_DEPTH_STENCIL_DESC m_depthStencilDescription;
    ID3D11DepthStencilState * m_depthStencilState;
    ID3D11DepthStencilView * m_depthStencilView;
    D3D11_RASTERIZER_DESC m_rasterDescription;
    D3D11_VIEWPORT m_viewport
    float m_fieldOfView;
    float m_screenAspectRatio;
    ID3D11RasterizerState * m_rasterState;
    DirectX :: XMMATRIX m_projectionMatrix;
    DirectX :: XMMATRIX m_worldMatrix;
    DirectX :: XMMATRIX m_orthographicMatrix;
    float m_screenDepth;
    float m_screenNear;
    };
    }
    }

    我尝试搜索这个问题,



    最后,我提出以下问题:

  • 什么是C4316的意思?


  • 如何解决导致此警告出现的问题?

    其他信息



    当我更改Visual Studio的配置管理器以编译x64时,

    解决方案


    C4316是什么意思?


    C4316是错误代码。它是一个唯一标识符,可以轻松找到文档


    在我的程式码中造成什么?


    DirectX :: XMMATRIX 类。该类的实例必须在16字节边界上对齐。编译器确保无论何时在堆栈或全局范围上创建一个 JGLib :: Graphics :: Direct3D 实例,它都会正确对齐,但如果您分配一个实例因为 malloc()和朋友通常只保证8字节对齐,所以编译器不能保证对象正确对齐。


    如果我忽略它,将来会有什么影响?


    由于对未对齐的数据执行 SSE 说明,访问这些矩阵实例时,您的代码可能会崩溃。


    如何解决导致此警告出现的问题?


    如文档所述,您需要重写类的运算符new operator delete 以保证16字节对齐。您可以使用 _aligned_malloc() _aligned_free() 分配和免费内存在较大的对齐方式。


    Important Information:

    • Development OS: Windows 8.1 64 bit
    • Target OS: Windows 8.1 64 bit
    • IDE: Visual Studio 2013 Professional
    • Language: C++

    The Problem:

    I get the following warning when compiling my static library project through the IDE:

    warning C4316: ... : object allocated on the heap may not be aligned 16
    

    I could simply ignore this warning...but I'm assuming it's there for a reason and would like to at least understand what it means and what implications it could have in the future.

    I believe this line of code is related to the problem, which is called inside my Win32 window wrapper class:

    m_direct3D = new Direct3D(this);
    

    m_direct3D is a pointer to my Direct3D wrapper class.

    Here is the header file for the wrapper (I admit it needs trimming down):

    #pragma once
    
    // Windows
    #include <d3d11.h>
    #include <DirectXMath.h>
    
    // Standard
    #include <stdint.h>
    #include <vector>
    
    // JGlib
    #include "Window.h"
    
    namespace JGlib
    {
        namespace Graphics
        {
            class Direct3D
            {
            public:
                // Construtor and destructor
                Direct3D(const JGlib::Graphics::Window* window);
                ~Direct3D();
    
                // Public methods
                void Initialise();
                void BeginDraw();
                void Draw();
                void EndDraw();
    
            private:
                // Private methods
    
                // Private member variables
                const Window*               m_window;
                ID3D11Device*               m_device;
                IDXGIAdapter*               m_adapter;
                DXGI_ADAPTER_DESC           m_adapterDescription;
                uint32_t                    m_videoCardMemory;
                IDXGIFactory*               m_factory;
                IDXGIOutput*                m_monitor;
                DXGI_MODE_DESC*             m_displayModes;
                uint32_t                    m_numberOfModes;    
                DXGI_RATIONAL               m_refreshRate;
                DXGI_SWAP_CHAIN_DESC        m_swapChainDescription;
                D3D_FEATURE_LEVEL           m_featureLevel;
                ID3D11DeviceContext*        m_deviceContext;
                IDXGISwapChain*             m_swapChain;
                ID3D11Texture2D*            m_backBuffer;
                ID3D11RenderTargetView*     m_renderTargetView;
                ID3D11Texture2D*            m_depthStencilBuffer;
                D3D11_TEXTURE2D_DESC        m_depthBufferDescription;
                D3D11_DEPTH_STENCIL_DESC    m_depthStencilDescription;
                ID3D11DepthStencilState*    m_depthStencilState;
                ID3D11DepthStencilView*     m_depthStencilView;
                D3D11_RASTERIZER_DESC       m_rasterDescription;
                D3D11_VIEWPORT              m_viewport; 
                float                       m_fieldOfView;
                float                       m_screenAspectRatio;
                ID3D11RasterizerState*      m_rasterState;
                DirectX::XMMATRIX           m_projectionMatrix;
                DirectX::XMMATRIX           m_worldMatrix;
                DirectX::XMMATRIX           m_orthographicMatrix;
                float                       m_screenDepth;
                float                       m_screenNear;
            };
        }
    }
    

    I tried googling the issue, but found little information. The information I did find I did not understand.

    The conclude, I am asking the following:

    1. What does C4316 mean?
    2. What is causing it in my code?
    3. What implications could this have in the future, if I ignore it?
    4. How do I "fix" the problem that is causing this warning to appear?

    Additional Information:

    When I changed Visual Studio's configuration manager to compile for x64, this issue does not occur.

    解决方案

    What does C4316 mean?

    C4316 is the error code. It's a unique identifier that makes it easy to find the documentation.

    What is causing it in my code?

    The usage of the DirectX::XMMATRIX class. Instances of that class must be aligned on 16-byte boundaries. The compiler makes sure that whenever you create a JGLib::Graphics::Direct3D instance on the stack or at global scope, it will align it properly, but if you allocate an instance dynamically on the heap, the compiler can't guarantee that the object will be aligned properly, because malloc() and friends typically only guarantee 8-byte alignment.

    What implications could this have in the future, if I ignore it?

    Your code may crash when accessing those matrix instances due to SSE instructions operating on misaligned data.

    How do I "fix" the problem that is causing this warning to appear?

    As the documentation suggests, you need to override your class's operator new and operator delete in order to guarantee 16-byte alignment. You can use _aligned_malloc() and _aligned_free() to allocate and free memory aligned on larger alignments.

    这篇关于警告C4316:在堆上分配的对象可能不对齐16的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆